Перейти к содержимому
Alexey383

Туториалы по хакингу Sonic (Genesis/Mega Drive)

Рекомендуемые сообщения

Ещё один гайд от меня :3

Как войти в выбор уровней в соник 2 БЕЗ кода?

Идём в роутину "TitleScreen_Loop:" и видим:

TitleScreen_Loop:
	move.b	#VintID_Title,(Vint_routine).w
	bsr.w	WaitForVint
	jsr	(RunObjects).l
	jsrto	(SwScrl_Title).l, JmpTo_SwScrl_Title
	jsr	(BuildSprites).l

	; write alternating 0s and 4s, 80 times, at every 4th word,
	; starting at Sprite_Table+6
	lea	(Sprite_Table+4).w,a1
	moveq	#0,d0

	moveq	#79,d6
-	tst.w	(a1)
	bne.s	+
	bchg	#2,d0
	move.w	d0,2(a1)
+	addq.w	#8,a1
	dbf	d6,-

	bsr.w	RunPLC_RAM
	bsr.w	TailsNameCheat
	tst.w	(Demo_Time_left).w
	beq.w	TitleScreen_Demo
	tst.b	(IntroSonic+objoff_2F).w
	beq.w	TitleScreen_Loop
	move.b	(Ctrl_1_Press).w,d0
	or.b	(Ctrl_2_Press).w,d0
	andi.b	#button_start_mask,d0
	beq.w	TitleScreen_Loop ; loop until Start is pressed
	move.b	#GameModeID_Level,(Game_Mode).w ; => Level (Zone play mode)
	move.b	#var_lives,(Life_count).w ; Кол-во жизней
	move.b	#var_lives,(Life_count_2P).w ; Кол-во жизней 2ого игрока
	moveq	#0,d0
	move.w	d0,(Ring_count).w
	move.l	d0,(Timer).w
	move.l	d0,(Score).w
	move.w	d0,(Ring_count_2P).w
	move.l	d0,(Timer_2P).w
	move.l	d0,(Score_2P).w
	move.b	d0,(Continue_count).w
	move.l	#5000,(Next_Extra_life_score).w
	move.l	#5000,(Next_Extra_life_score_2P).w
	move.b	#MusID_FadeOut,d0 ; prepare to stop music (fade out)
	bsr.w	PlaySound
	moveq	#0,d0
	move.b	(Title_screen_option).w,d0
	bne.s	TitleScreen_CheckIfChose2P	; branch if not a 1-player game

	moveq	#0,d0
	move.w	d0,(Two_player_mode_copy).w
	move.w	d0,(Two_player_mode).w
    if emerald_hill_zone_act_1=0
	move.w	d0,(Current_ZoneAndAct).w ; emerald_hill_zone_act_1
    else
	move.w #emerald_hill_zone_act_1,(Current_ZoneAndAct).w
    endif
	tst.b	(Level_select_flag).w	; has level select cheat been entered?
	beq.s	+			; if not, branch
	btst	#button_A,(Ctrl_1_Held).w ; is A held down?
	beq.s	+	 		; if not, branch
	move.b	#GameModeID_LevelSelect,(Game_Mode).w ; => LevelSelectMenu
	rts

Видите эти строчки?

	tst.b	(Level_select_flag).w	; has level select cheat been entered?
	beq.s	+			; if not, branch
	btst	#button_A,(Ctrl_1_Held).w ; is A held down?
	beq.s	+	 		; if not, branch
	move.b	#GameModeID_LevelSelect,(Game_Mode).w ; => LevelSelectMenu
	rts

И так, мы должны из этих строчек убрать 2 первые строчки. Получается:

	btst	#button_A,(Ctrl_1_Held).w ; is A held down?
	beq.s	+	 		; if not, branch
	move.b	#GameModeID_LevelSelect,(Game_Mode).w ; => LevelSelectMenu
	rts

ВСЁ! Тоже легко, не правда ли?

Поделиться сообщением


Ссылка на сообщение

Ещё 2 мини гайда :3

Как убрать Speed Cap (не "Air Speed Cap")

Идём в роутину "Obj_CapSpeed:" и видим:

Obj_CapSpeed:
	move.w	x_vel(a0),d2
	bpl.s	+	; branch, if object is moving right
	; going left
	neg.w	d0	; set opposite direction
	cmp.w	d0,d2	; is object's current x velocity lower than max?
	bhs.s	++	; if yes, branch
	move.w	d0,d2	; else, cap speed
	bra.w	++
; ===========================================================================
+	; going right
	cmp.w	d0,d2	; is object's current x velocity lower than max?
	bls.s	+	; if yes, branch
	move.w	d0,d2	; else, cap speed
+
	move.w	y_vel(a0),d3
	bpl.s	+	; branch, if object is moving down
	; going up
	neg.w	d1	; set opposite direction
	cmp.w	d1,d3	; is object's current y velocity lower than max?
	bhs.s	++	; if yes, branch
	move.w	d1,d3	; else, cap speed
	bra.w	++
; ===========================================================================
+	; going down
	cmp.w	d1,d3	; is object's current y velocity lower than max?
	bls.s	+	; if yes, branch
	move.w	d1,d3	; else, cap speed
+	; update speed
	move.w	d2,x_vel(a0)
	move.w	d3,y_vel(a0)
	rts

И удаляем все строчки с комментарием "else, cap speed".

Получается:

Obj_CapSpeed:
	move.w	x_vel(a0),d2
	bpl.s	+	; branch, if object is moving right
	; going left
	neg.w	d0	; set opposite direction
	cmp.w	d0,d2	; is object's current x velocity lower than max?
	bhs.s	++	; if yes, branch
	bra.w	++
; ===========================================================================
+	; going right
	cmp.w	d0,d2	; is object's current x velocity lower than max?
	bls.s	+	; if yes, branch
+
	move.w	y_vel(a0),d3
	bpl.s	+	; branch, if object is moving down
	; going up
	neg.w	d1	; set opposite direction
	cmp.w	d1,d3	; is object's current y velocity lower than max?
	bhs.s	++	; if yes, branch
	bra.w	++
; ===========================================================================
+	; going down
	cmp.w	d1,d3	; is object's current y velocity lower than max?
	bls.s	+	; if yes, branch
+	; update speed
	move.w	d2,x_vel(a0)
	move.w	d3,y_vel(a0)
	rts

Всё!

Ещё один:

Как принудительно включить Debug (как в хакинг студии) (Проще простого)

Ищем роутину "Level_FromCheckpoint:" и в конце добавляем вот эту строчку:

	move.b	#1,(Debug_mode_flag).w

Всё! Надеюсь я был полезен кому-то :3

Поделиться сообщением


Ссылка на сообщение

Гайд по добавлению обновлённого SEGA Screen'а в Sonic 1.
(Оригинал с SSRG)
Открываем sonic1.asm,и в самом начале файла добавляем:
 

BitMapXpos    equ    4
BitMapYpos    equ    2
BitMapWidth    equ    256
BitMapHeight    equ    128
BitMapCellHeight    equ    (BitMapHeight/8)
BitMapCellWidth    equ    (BitMapWidth/8)
WallPalBits    equ    $2000
MapRowWidth    equ    64
bitmapaddr    equ $8000
scrollAaddr    equ    $C000
spriteaddr    equ    $D800
hscrolladdr    equ    $DC00
scrollBaddr    equ    $E000
windowaddr    equ    $F000
DMA_ByteInc    equ    $0
DMA_Length1    equ    $2
DMA_Length2    equ    $4
DMA_SrcAdr1    equ    $6
DMA_SrcAdr2    equ    $8
DMA_SrcAdr3    equ    $A
DMA_DMAenbl    equ    $C
DMA_DstAdr1    equ    $E
DMA_DstAdr2    equ    $10
DMA_DMADisbl    equ    $12
SNDADD          EQU     $A04000
SNDDAT          EQU     $A04001
CNTLA           EQU     $A10008
CNTLB           EQU     $A1000A
CNTLC           EQU     $A1000C
CNTLAW          EQU     $A10009
CNTLBW          EQU     $A1000B
CNTLCW          EQU     $A10009
PPCNTL          EQU     $A1000D
PPDATA          EQU     $A10007
BUSREQ          EQU     $A11100
BUSRES          EQU     $A11200
Z80RAM          EQU     $A00000
VDATA           EQU     $C00000
VCTRL           EQU     $C00004
SetVdpRegister  MACRO
        MOVE.W  #$8000|(\1<<8)|\2,VCTRL; check out the SEGA manual
        ENDM
SetVdpRegisterCode      MACRO
        and.w   #$00ff,\2             ; Mask off high part
        or.w    #$8000|(\1<<8),\2
        move.w  \2,VCTRL
        ENDM
AutoIncrement   MACRO
        SetVdpRegister  15,\1
        ENDM
VramWrtAddr  MACRO
        MOVE.L  #$40000000|((\1&$3fff)<<16)|((\1>>14)&3),\2
        ENDM
VSramWrtAddr  MACRO
        MOVE.L  #$40000010|((\1&$3fff)<<16)|((\1>>14)&3),\2
        ENDM
CramWrtAddr  MACRO
        MOVE.L  #$C0000000|((\1&$3fff)<<16)|((\1>>14)&3),\2
        ENDM
CalcVramWrtAddrCode MACRO
        move.w  \1,\2         ; Copy for lower 14 bits
        and.l   #$3fff,\2     ; mask
        lsl.l   #8,\2
        lsl.l   #8,\2         ; Shift up
        or.l    #$40000000,\2 ; Set bit that tells VDP it's a VRAM WRITE
        lsr.l   #8,\1
        lsr.l   #6,\1         ; Shift down 14 bits
        and.l   #$3,\1
        or.l    \1,\2         ; and combine
        ENDM

Потом находим это:

; end of 'ROM'
EndOfRom:

и перед этим вставляем это:

SegaLogo
    move.l  #10,d6
    bsr    delay
    SetVdpRegister  1,$44
    SetVdpRegister  16,1
    lea.l   LogoChars,A0
    VramWrtAddr  $20,VCTRL
    move.l  #16*147,d0
ldchar:
    move.w  (a0)+,VDATA
    dbra    d0,ldchar
    lea.l   LogoPalette,a0
    CramWrtAddr  $0,VCTRL
    moveq.l #15,d0
ldpal:
    move.w  (a0)+,VDATA
    dbra    d0,ldpal
    VramWrtAddr $C51C,D2
    moveq.l    #1,d1
    moveq.l #3,d3
newrow:
    move.l    d2,VCTRL
    add.l   #$00800000,D2
    moveq.l #11,D0
wrtrow1:
    move.w    d1,VDATA
    addq.w    #1,d1
    dbra    d0,wrtrow1
    dbra    d3,newrow
    lea.l   LogoCycle,a0
    add.l    #32,a0
    moveq   #16,d1
    move.l  #$3f,d6
    jsr    delay
stcycl:
    move.l    a0,a1
    move.l  #$c00e0000,$C00004.L
    moveq   #8,d0
cyc:
    move.w  (a1)+,VDATA
    dbra    d0,cyc
    move.l  #$08,d6
    bsr     delay
    subq    #2,a0
    dbra    d1,stcycl
    move.l  #$40,d6
    bsr     delay
    CramWrtAddr  $0,VCTRL
    moveq.l #15,d0
.clpal:
    move.w  #0,VDATA
    dbra    d0,.clpal
    VramWrtAddr $C000,VCTRL
    move.l #64*28,d0
.clmap:
    move.w  #0,VDATA
    dbra    d0,.clmap
    rts
delay:
    move.l  #$fff,d7
dt:    nop
    dbra    d7,dt
    dbra    d6,delay
    rts
LogoChars:
                dc.l    $00000000,$00000111,$00011BBC,$001ABBBB
                dc.l    $01AABBBB,$01AAABBB,$1AAAABB1,$19AAAA1B
                dc.l    $00000000,$11111111,$CCCDDDDE,$CCCCDDDD
                dc.l    $CCCCDDDD,$BCCCCDDD,$11111111,$BBCCCCDD
                dc.l    $00000000,$11111100,$EEEFF100,$EEEEF101
                dc.l    $EEEEF11A,$DEEEE11A,$111111AA,$DDEEE1AA
                dc.l    $00000000,$00111111,$11BBCCCC,$BBBBCCCC
                dc.l    $ABBBBCCC,$ABBBBCCC,$AABBB111,$AABB1BCC
                dc.l    $00000000,$11111111,$DDDDEEEE,$DDDDEEEE
                dc.l    $CDDDDEEE,$CDDDDEEE,$11111111,$CCDDDDEE
                dc.l    $00000000,$11110000,$FFF10011,$FFF101BB
                dc.l    $EFF11ABB,$EFF11ABB,$1111AAAB,$EEF1AAAB
                dc.l    $00000000,$11111111,$BCCCCDDD,$BCCCCDDD
                dc.l    $BBCCCCDD,$BBCCCCDD,$BBB11111,$B11CCCCD
                dc.l    $00000000,$11111111,$DEEEEFFF,$DEEEEFFF
                dc.l    $DDEEEEFF,$DDEEEEFF,$11111111,$DDDEEEEF
                dc.l    $00000000,$11000000,$F1000000,$F1000000
                dc.l    $F1000000,$F1000000,$11000000,$F1000001
                dc.l    $00000000,$00000111,$00011DDD,$001CCDDD
                dc.l    $01CCCDDD,$1BCCCCDD,$1BCCCCDD,$BBBCCC11
                dc.l    $00001111,$10000010,$E1100010,$DEE10010
                dc.l    $DEEE1010,$DDEEE100,$DDEEE100,$DDDEEE10
                dc.l    $10100001,$00110011,$00101101,$00100001
                dc.l    $00100001,$00000000,$00000000,$00000000
                dc.l    $19AAA1BB,$199AA1AB,$199AA1AB,$1999A1AA
                dc.l    $1999A1AA,$199991AA,$199991AA,$1899991A
                dc.l    $BBCCCCDD,$BBBCCCCD,$BBBCCCCD,$BB111111
                dc.l    $BBBBCCCC,$ABBBBCCC,$ABBBBCCC,$AABBBBCC
                dc.l    $DDEEE19A,$DDDEE19A,$DDDEE199,$11111199
                dc.l    $11111199,$CD111199,$CDD11199,$CCDD1199
                dc.l    $AAA1BBBC,$AAA1BBBC,$AAA1BBBB,$AAA1BBB1
                dc.l    $9AA1ABBB,$9AA1ABBB,$99A1AABB,$99A1AABB
                dc.l    $CCCDDDDE,$CCCDDDDE,$CCCCDDDD,$11111111
                dc.l    $BCCCCDDD,$BCCCCDDD,$BBCCCCDD,$BBCCCCDD
                dc.l    $EEE1AAAA,$EEE19AAA,$EEE19AAA,$111199AA
                dc.l    $D11199AA,$D111999A,$D111999A,$D1119999
                dc.l    $1BBBCCCC,$1BBBBCCC,$1BBBBCCC,$1ABBB111
                dc.l    $1ABBB1CC,$1AABB1BC,$1AABB1BC,$1AAAB1BB
                dc.l    $DDDDEEEE,$CDDDEEEE,$CDDDDEEE,$11111111
                dc.l    $CCDDDDEE,$CCCDDDEE,$CCCDDDDE,$CCCCDDDE
                dc.l    $F1000001,$F1000001,$E100001A,$1100001A
                dc.l    $E100001A,$E10001AA,$E10001AA,$E100019A
                dc.l    $BBBCCC11,$BBBBC1CC,$BBBBC1CC,$ABBBB1CC
                dc.l    $ABBB1CCC,$AABB1BCC,$AABB1BCC,$AAA1BBBC
                dc.l    $DDDEEE10,$1DDDEE10,$1DDDEEE1,$1DDDDEE1
                dc.l    $C1DDDEE1,$C1DDDDEE,$C1DDDDEE,$CC1DDDDE
                dc.l    $00000000,$00000000,$00000000,$00000000
                dc.l    $00000000,$10000000,$10000000,$10000000
                dc.l    $019999A1,$0189999A,$0019999A,$00189999
                dc.l    $00011199,$11111111,$18888999,$18888899
                dc.l    $1111111C,$AAABBBB1,$AAABBBBC,$AAAABBBB
                dc.l    $AAAABBBB,$1111ABBB,$9AAAABBB,$99AAAABB
                dc.l    $CCDD1189,$CCCDD189,$1CCDD188,$1CCCD188
                dc.l    $1CCCD188,$1CCCC188,$1CCCC188,$1BCCC188
                dc.l    $99911111,$9991AAAB,$9991AAAA,$9991AAAA
                dc.l    $89919AAA,$89919AA1,$889199AA,$889199AA
                dc.l    $11111111,$BBBCCCCD,$BBBBCCCC,$BBBBCCCC
                dc.l    $ABBBBCCC,$11111111,$AABBBBCC,$AABBBBCC
                dc.l    $11119999,$D1118999,$D1118999,$D1118899
                dc.l    $C1118899,$11118889,$CCD18889,$CCD18888
                dc.l    $1AAAB111,$1AAAA1BB,$1AAAA1BB,$19AAA1BB
                dc.l    $19AAA1BB,$199AA111,$199AAAAB,$1999AAAA
                dc.l    $11111DDD,$BCCC1DDD,$BCCC1DDD,$BBCC1CDD
                dc.l    $BBCC1CDD,$BBBC1CCD,$BBBC1CCD,$BBBB1CCC
                dc.l    $E100199A,$E1001999,$D1001999,$D1018999
                dc.l    $D1018999,$D1018899,$D1188899,$D1188889
                dc.l    $AAA1BBBC,$AAA1BBBB,$AA1ABBBB,$9A1AABBB
                dc.l    $9A1AAB11,$91AAAA11,$91AAAABB,$919AAAAB
                dc.l    $CC1DDDDE,$CC1CDDDD,$CCC1DDDD,$BCC1CDDD
                dc.l    $BCC1CDDD,$BBCC1CDD,$BBCC1CDD,$BBBC1CCD
                dc.l    $E1000000,$E1000000,$E1000000,$DE100000
                dc.l    $DE100000,$DD100000,$DDE10000,$DDD10000
                dc.l    $17888899,$17788889,$11111111,$17778888
                dc.l    $17778888,$17777888,$17777888,$11111111
                dc.l    $99AAAABB,$999AAAA1,$1111111B,$9999AAAA
                dc.l    $9999AAAA,$89999AAA,$89999AAA,$11111111
                dc.l    $1BCCC178,$BBBCC178,$BBBCC177,$BBBB1017
                dc.l    $BBBB1017,$ABB10001,$A1100000,$10000000
                dc.l    $8881999A,$8889199A,$88889111,$88889999
                dc.l    $78888999,$78888999,$11888899,$00111111
                dc.l    $AAABBBBC,$AAABBBBC,$11111111,$AAAABBBB
                dc.l    $9AAAABBB,$9AAAABBB,$99AAAABB,$11111111
                dc.l    $CCC17888,$CCC17888,$11111788,$CCC11788
                dc.l    $BCC11778,$BCC10178,$BBC10011,$11110000
                dc.l    $1999AAAA,$81199AAA,$88911111,$889999AA
                dc.l    $8889999A,$8889999A,$88889999,$11111111
                dc.l    $BBBB1CCC,$ABBB1CCC,$11111BCC,$AABBBBCC
                dc.l    $AAABBBBC,$AAABBBBC,$AAAABBBB,$11111111
                dc.l    $D1788889,$C1778888,$CC778888,$CC777881
                dc.l    $CC777881,$CC777781,$CC777781,$11111111
                dc.l    $199AAAAB,$1999AAAA,$19991111,$89991AAA
                dc.l    $89911AAA,$889119AA,$881119AA,$11111111
                dc.l    $BBBCC1CD,$BBBBC1CC,$111111CC,$ABBBBCCC
                dc.l    $ABBBBCCC,$AABBBBCC,$AABBBBCC,$11111111
                dc.l    $DDD10000,$DDDD1000,$DDDD1000,$CDDD1000
                dc.l    $CDDDD100,$CCDDD100,$CCDDD100,$11111100
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00110000,$00110000,$00110000,$00110000
    DC.L    $00110000,$00000000,$00110000,$00000000
    DC.L    $01101100,$01101100,$01101100,$00000000
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $01101100,$01101100,$11111110,$01101100
    DC.L    $11111110,$01101100,$01101100,$00000000
    DC.L    $00110000,$01111100,$11000000,$01111000
    DC.L    $00001100,$11111000,$00110000,$00000000
    DC.L    $00000000,$11000110,$11001100,$00011000
    DC.L    $00110000,$01100110,$11000110,$00000000
    DC.L    $00111000,$01101100,$00111000,$01110110
    DC.L    $11011100,$11001100,$01110110,$00000000
    DC.L    $01100000,$01100000,$11000000,$00000000
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00011000,$00110000,$01100000,$01100000
    DC.L    $01100000,$00110000,$00011000,$00000000
    DC.L    $01100000,$00110000,$00011000,$00011000
    DC.L    $00011000,$00110000,$01100000,$00000000
    DC.L    $00000000,$01100110,$00111100,$11111111
    DC.L    $00111100,$01100110,$00000000,$00000000
    DC.L    $00000000,$00110000,$00110000,$11111100
    DC.L    $00110000,$00110000,$00000000,$00000000
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00000000,$00110000,$00110000,$01100000
    DC.L    $00000000,$00000000,$00000000,$11111100
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00000000,$00110000,$00110000,$00000000
    DC.L    $00000110,$00001100,$00011000,$00110000
    DC.L    $01100000,$11000000,$10000000,$00000000
    DC.L    $01111100,$11000110,$11001110,$11011110
    DC.L    $11110110,$11100110,$01111100,$00000000
    DC.L    $00110000,$01110000,$00110000,$00110000
    DC.L    $00110000,$00110000,$01111000,$00000000
    DC.L    $11111000,$00001100,$00001100,$00111000
    DC.L    $01100000,$11000000,$11111100,$00000000
    DC.L    $11111000,$00001100,$00001100,$00111000
    DC.L    $00001100,$00001100,$11111000,$00000000
    DC.L    $00011100,$00111100,$01101100,$11001100
    DC.L    $11111110,$00001100,$00001100,$00000000
    DC.L    $11111100,$11000000,$11111000,$00001100
    DC.L    $00001100,$00001100,$11111000,$00000000
    DC.L    $00111100,$01100000,$11000000,$11111000
    DC.L    $11001100,$11001100,$01111000,$00000000
    DC.L    $11111100,$00001100,$00011000,$00110000
    DC.L    $01100000,$11000000,$11000000,$00000000
    DC.L    $01111000,$11001100,$11001100,$01111000
    DC.L    $11001100,$11001100,$01111000,$00000000
    DC.L    $01111000,$11001100,$11001100,$01111100
    DC.L    $00001100,$00001100,$01111000,$00000000
    DC.L    $00000000,$00110000,$00110000,$00000000
    DC.L    $00000000,$00110000,$00110000,$00000000
    DC.L    $00000000,$00110000,$00110000,$00000000
    DC.L    $00000000,$00110000,$00110000,$01100000
    DC.L    $00011000,$00110000,$01100000,$11000000
    DC.L    $01100000,$00110000,$00011000,$00000000
    DC.L    $00000000,$00000000,$11111100,$00000000
    DC.L    $00000000,$11111100,$00000000,$00000000
    DC.L    $01100000,$00110000,$00011000,$00001100
    DC.L    $00011000,$00110000,$01100000,$00000000
    DC.L    $11111000,$00001100,$00001100,$00111000
    DC.L    $00110000,$00000000,$00110000,$00000000
    DC.L    $01111100,$11000110,$11011110,$11011110
    DC.L    $11011110,$11000000,$01111000,$00000000
    DC.L    $00110000,$01111000,$11001100,$11001100
    DC.L    $11111100,$11001100,$11001100,$00000000
    DC.L    $11111000,$11001100,$11001100,$11111000
    DC.L    $11001100,$11001100,$11111000,$00000000
    DC.L    $01111100,$11000000,$11000000,$11000000
    DC.L    $11000000,$11000000,$01111100,$00000000
    DC.L    $11111000,$11001100,$11001100,$11001100
    DC.L    $11001100,$11001100,$11111000,$00000000
    DC.L    $11111100,$11000000,$11000000,$11111000
    DC.L    $11000000,$11000000,$11111100,$00000000
    DC.L    $11111100,$11000000,$11000000,$11111000
    DC.L    $11000000,$11000000,$11000000,$00000000
    DC.L    $01111100,$11000000,$11000000,$11000000
    DC.L    $11011100,$11001100,$01111100,$00000000
    DC.L    $11001100,$11001100,$11001100,$11111100
    DC.L    $11001100,$11001100,$11001100,$00000000
    DC.L    $01111000,$00110000,$00110000,$00110000
    DC.L    $00110000,$00110000,$01111000,$00000000
    DC.L    $00011110,$00001100,$00001100,$00001100
    DC.L    $00001100,$00001100,$11111000,$00000000
    DC.L    $11000110,$11001100,$11011000,$11110000
    DC.L    $11011000,$11001100,$11000110,$00000000
    DC.L    $11000000,$11000000,$11000000,$11000000
    DC.L    $11000000,$11000000,$11111100,$00000000
    DC.L    $11000110,$11101110,$11111110,$11010110
    DC.L    $11000110,$11000110,$11000110,$00000000
    DC.L    $11000110,$11100110,$11110110,$11011110
    DC.L    $11001110,$11000110,$11000110,$00000000
    DC.L    $01111000,$11001100,$11001100,$11001100
    DC.L    $11001100,$11001100,$01111000,$00000000
    DC.L    $11111000,$11001100,$11001100,$11111000
    DC.L    $11000000,$11000000,$11000000,$00000000
    DC.L    $01111000,$11001100,$11001100,$11001100
    DC.L    $11001100,$11011000,$01101100,$00000000
    DC.L    $11111000,$11001100,$11001100,$11111000
    DC.L    $11110000,$11011000,$11001100,$00000000
    DC.L    $01111100,$11000000,$11000000,$01111000
    DC.L    $00001100,$00001100,$11111000,$00000000
    DC.L    $11111100,$00110000,$00110000,$00110000
    DC.L    $00110000,$00110000,$00110000,$00000000
    DC.L    $11001100,$11001100,$11001100,$11001100
    DC.L    $11001100,$11001100,$01111100,$00000000
    DC.L    $11001100,$11001100,$11001100,$11001100
    DC.L    $11001100,$01111000,$00110000,$00000000
    DC.L    $11000110,$11000110,$11000110,$11010110
    DC.L    $11111110,$11101110,$11000110,$00000000
    DC.L    $11000110,$11000110,$01101100,$00111000
    DC.L    $01101100,$11000110,$11000110,$00000000
    DC.L    $11001100,$11001100,$11001100,$01111000
    DC.L    $00110000,$00110000,$00110000,$00000000
    DC.L    $11111110,$00001100,$00011000,$00110000
    DC.L    $01100000,$11000000,$11111110,$00000000
    DC.L    $01111000,$01100000,$01100000,$01100000
    DC.L    $01100000,$01100000,$01111000,$00000000
    DC.L    $11000000,$01100000,$00110000,$00011000
    DC.L    $00001100,$00000110,$00000010,$00000000
    DC.L    $01111000,$00011000,$00011000,$00011000
    DC.L    $00011000,$00011000,$01111000,$00000000
    DC.L    $00010000,$00111000,$01101100,$11000110
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00000000,$00000000,$00000000,$11111111
    DC.L    $00110000,$00110000,$00011000,$00000000
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00000000,$00000000,$11111000,$00001100
    DC.L    $01111100,$11001100,$01111100,$00000000
    DC.L    $11000000,$11000000,$11111000,$11001100
    DC.L    $11001100,$11001100,$11111000,$00000000
    DC.L    $00000000,$00000000,$01111100,$11000000
    DC.L    $11000000,$11000000,$01111100,$00000000
    DC.L    $00001100,$00001100,$01111100,$11001100
    DC.L    $11001100,$11001100,$01111100,$00000000
    DC.L    $00000000,$00000000,$01111000,$11001100
    DC.L    $11111100,$11000000,$01111100,$00000000
    DC.L    $00111100,$01100000,$01100000,$11111000
    DC.L    $01100000,$01100000,$01100000,$00000000
    DC.L    $00000000,$00000000,$01111100,$11001100
    DC.L    $11001100,$01111100,$00001100,$11111000
    DC.L    $11000000,$11000000,$11111000,$11001100
    DC.L    $11001100,$11001100,$11001100,$00000000
    DC.L    $00110000,$00000000,$00110000,$00110000
    DC.L    $00110000,$00110000,$00110000,$00000000
    DC.L    $00011000,$00000000,$00011000,$00011000
    DC.L    $00011000,$00011000,$00011000,$11110000
    DC.L    $11000000,$11000000,$11001100,$11011000
    DC.L    $11110000,$11011000,$11001100,$00000000
    DC.L    $01110000,$00110000,$00110000,$00110000
    DC.L    $00110000,$00110000,$00110000,$00000000
    DC.L    $00000000,$00000000,$11000110,$11111110
    DC.L    $11010110,$11000110,$11000110,$00000000
    DC.L    $00000000,$00000000,$11111000,$11001100
    DC.L    $11001100,$11001100,$11001100,$00000000
    DC.L    $00000000,$00000000,$01111000,$11001100
    DC.L    $11001100,$11001100,$01111000,$00000000
    DC.L    $00000000,$00000000,$11111000,$11001100
    DC.L    $11001100,$11001100,$11111000,$11000000
    DC.L    $00000000,$00000000,$01111100,$11001100
    DC.L    $11001100,$11001100,$01111100,$00001100
    DC.L    $00000000,$00000000,$11011100,$11100000
    DC.L    $11000000,$11000000,$11000000,$00000000
    DC.L    $00000000,$00000000,$01111100,$11000000
    DC.L    $01111000,$00001100,$11111000,$00000000
    DC.L    $01100000,$01100000,$11111100,$01100000
    DC.L    $01100000,$01100000,$00111100,$00000000
    DC.L    $00000000,$00000000,$11001100,$11001100
    DC.L    $11001100,$11001100,$01111100,$00000000
    DC.L    $00000000,$00000000,$11001100,$11001100
    DC.L    $11001100,$01111000,$00110000,$00000000
    DC.L    $00000000,$00000000,$11000110,$11000110
    DC.L    $11010110,$11111110,$11000110,$00000000
    DC.L    $00000000,$00000000,$11000110,$01101100
    DC.L    $00111000,$01101100,$11000110,$00000000
    DC.L    $00000000,$00000000,$11001100,$11001100
    DC.L    $11001100,$01111100,$00001100,$11111000
    DC.L    $00000000,$00000000,$11111100,$00011000
    DC.L    $00110000,$01100000,$11111100,$00000000
    DC.L    $00011100,$00110000,$00110000,$11100000
    DC.L    $00110000,$00110000,$00011100,$00000000
    DC.L    $00011000,$00011000,$00011000,$00000000
    DC.L    $00011000,$00011000,$00011000,$00000000
    DC.L    $11100000,$00110000,$00110000,$00011100
    DC.L    $00110000,$00110000,$11100000,$00000000
    DC.L    $01110110,$11011100,$00000000,$00000000
    DC.L    $00000000,$00000000,$00000000,$00000000
    DC.L    $00000000,$00010000,$00111000,$01101100
    DC.L    $11000110,$11000110,$11111110,$00000000
    dc.l    $10000000
    dc.l    $00000000
    dc.l    $00000000
    dc.l    $00000000
    dc.l    $00000000
    dc.l    $00000000
    dc.l    $00000000
    dc.l    $00000000
    dc.l    $00011000
    dc.l    $00011000
    dc.l    $00011000
    dc.l    $11000011
    dc.l    $11000011
    dc.l    $00011000
    dc.l    $00011000
    dc.l    $00011000
    dc.l    $00000000
    dc.l    $01100110
    dc.l    $11111110
    dc.l    $11111110
    dc.l    $10011010
    dc.l    $00000010
    dc.l    $00000010
    dc.l    $00000010
    dc.l    $11000000
    dc.l    $11110000
    dc.l    $11111100
    dc.l    $01111000
    dc.l    $01111100
    dc.l    $00100110
    dc.l    $00000011
    dc.l    $00000000
LogoPalette:
                dc.w    $000,$EEE,$EEE,$EEE,$EEE,$EEE,$EEE
LogoCycle:
                dc.w    $EA0,$E80,$E60,$E40,$E20,$E00,$C00,$A00,$800
                dc.w    $A00,$C00,$E00,$E20,$E40,$E60,$E80,$EA0,$E80
                dc.w    $E60,$E40,$E20,$E00,$C00,$A00,$800

Потом переходим в CheckSumCheck и после этого:

CheckSumCheck:

вставляем это:

                jsr     SegaLogo

И наконец,переходим в SegaScreen и заменяем это:

SegaScreen:				; XREF: GameModeArray
		move.b	#$E4,d0
		bsr.w	PlaySound_Special ; stop music
		bsr.w	ClearPLC
		bsr.w	Pal_FadeFrom
		lea	($C00004).l,a6
		move.w	#$8004,(a6)
		move.w	#$8230,(a6)
		move.w	#$8407,(a6)
		move.w	#$8700,(a6)
		move.w	#$8B00,(a6)
		clr.b	($FFFFF64E).w
		move	#$2700,sr
		move.w	($FFFFF60C).w,d0
		andi.b	#$BF,d0
		move.w	d0,($C00004).l
		bsr.w	ClearScreen
		move.l	#$40000000,($C00004).l
		lea	(Nem_SegaLogo).l,a0 ; load Sega	logo patterns
		bsr.w	NemDec
		lea	($FF0000).l,a1
		lea	(Eni_SegaLogo).l,a0 ; load Sega	logo mappings
		move.w	#0,d0
		bsr.w	EniDec
		lea	($FF0000).l,a1
		move.l	#$65100003,d0
		moveq	#$17,d1
		moveq	#7,d2
		bsr.w	ShowVDPGraphics
		lea	($FF0180).l,a1
		move.l	#$40000003,d0
		moveq	#$27,d1
		moveq	#$1B,d2
		bsr.w	ShowVDPGraphics
		moveq	#0,d0
		bsr.w	PalLoad2	; load Sega logo pallet
		move.w	#-$A,($FFFFF632).w
		move.w	#0,($FFFFF634).w
		move.w	#0,($FFFFF662).w
		move.w	#0,($FFFFF660).w
		move.w	($FFFFF60C).w,d0
		ori.b	#$40,d0
		move.w	d0,($C00004).l

Sega_WaitPallet:
		move.b	#2,($FFFFF62A).w
		bsr.w	DelayProgram
		bsr.w	PalCycle_Sega
		bne.s	Sega_WaitPallet

		move.b	#$E1,d0
		bsr.w	PlaySound_Special ; play "SEGA"	sound
		move.b	#$14,($FFFFF62A).w
		bsr.w	DelayProgram
		move.w	#$1E,($FFFFF614).w

Sega_WaitEnd:
		move.b	#2,($FFFFF62A).w
		bsr.w	DelayProgram
		tst.w	($FFFFF614).w
		beq.s	Sega_GotoTitle
		andi.b	#$80,($FFFFF605).w ; is	Start button pressed?
		beq.s	Sega_WaitEnd	; if not, branch

Sega_GotoTitle:
		move.b	#4,($FFFFF600).w ; go to title screen
		rts	

на это:

SegaScreen:        ; XREF: GameModeArray
        move.b    #$E4,d0
        bsr.w    PlaySound_Special; stop music
        bsr.w    ClearPLC
        bsr.w    Pal_FadeFrom
        lea    ($C00004).l,a6
        move.w    #$8004,(a6)
        move.w    #$8230,(a6)
        move.w    #$8407,(a6)
        move.w    #$8700,(a6)
        move.w    #$8B00,(a6)
        clr.b    ($FFFFF64E).w
        move    #$2700,sr
        move.w    ($FFFFF60C).w,d0
        andi.b    #$BF,d0
        move.w    d0,($C00004).l
        bsr.w    ClearScreen
        move.l    #$40000000,($C00004).l
        lea    (Nem_SegaLogo).l,a0; load Sega    logo patterns
        bsr.w    NemDec
        lea    ($FF0000).l,a1
        lea    (Eni_SegaLogo).l,a0; load Sega    logo mappings
        move.w    #0,d0
        bsr.w    EniDec
        lea    ($FF0000).l,a1
        move.w    #-$A,($FFFFF632).w
        move.w    #0,($FFFFF634).w
        move.w    #0,($FFFFF662).w
        move.w    #0,($FFFFF660).w
        move.w    ($FFFFF60C).w,d0
        ori.b    #$40,d0
        move.w    d0,($C00004).l

Sega_GotoTitle:
        move.b    #4,($FFFFF600).w; go to title screen
        rts

P.S.рекомендуется использовать дизассембл Hivebrain'а,адаптированный под ASM68K.

  • Дизлайк 2

Поделиться сообщением


Ссылка на сообщение
В 29.11.2012 в 05:06, Мимо проходящий сказал:

Как добавить в Sonic 1 самонаводящуюся атаку.

Прежде чем испробовать эту особенность Соника, настоятельно рекомендую потереть старый JumpDash от vladikcomper'а. Если он у вас, конечно, стоит.

Переходим по ссылке Obj01_MdJump2. В самое её начало вписываем это:

 


   bsr.w Sonic_JumpDash
 

 

 

Далее, в любое свободное место вставляем следующий код. Я лично вставил его после Sonic_JumpHeight. Для этого найдите строчку «; End of function Sonic_JumpHeight». Сразу после нее вставьте новый код:

 


Sonic_JumpDash:
   cmpi.b #$02,($FFFFFFEB).w ; if STATE == HOMING
   beq.s Sonic_JD_ChkFramesCount ; checking frames
   tpress A+B+C,(SonicControl) ; if A, B or C pressed
   bne.s Sonic_JD_Init ; then initialize
   rts

Sonic_JD_ChkFramesCount:
   subq.b #01,$001F(a0) ; decrement count of remained frames
   bne.s Sonic_JD_ExecHoming ; if frames > 0, execute homing
   clr.b ($FFFFFFEB).w ; if not, then not
   rts

Sonic_JD_ExecHoming:
   move.w $003A(a0),a1 ; get address of object
   move.w $000C(a1),d1 ; get Y-pos of object
   sub.w $000C(a0),d1 ; get deltaY
   move.w $0008(a1),d2 ; get X-pos of object
   sub.w $0008(a0),d2 ; get deltaX
   jsr CalcAngle.l ; calculate Angle (A)
   jsr CalcSine.l ; get sin & cos of Angle (A)
   move.w #$00001000,d3 ; set homing speed (HS)
   muls.w d3,d0 ; get X-velocity (sin(A)*HS)
   muls.w d3,d1 ; get Y-velocity (cos(A)*HS)
   asr.l #8, d0 ; X-velocity / 256
   asr.l #8, d1 ; Y-velocity / 256
   move.w d1,$0012(a0) ; SET Y-velocity
   move.w d0,$0010(a0) ; SET X-velocity
   move.w d0,$0014(a0) ; SET Ground-velocity
   rts

Sonic_JD_Init:
   lea ($FFFFD800).w,a1 ; set address of Objects
   move.w #$005F,d6 ; set max count of Objects for checking
   moveq #$FFFFFFFF,d3 ; set minimal distanсe from Object to Sonic

Sonic_JD_CheckObject:
   tst.b $01(a1) ; check1
   bpl.w Sonic_JD_NextObject
   tst.b $20(a1) ; check2
   bne.w Sonic_JD_GoodObject

Sonic_JD_NextObject:
   lea $0040(a1),a1 ; select next Object block
   dbf d6, Sonic_JD_CheckObject ; repeat until reach last Object
   cmpi.l #$00006400, d3 ; check distance from Sonic to closest Object
   bhi.w Sonic_JD_ExecJumpDash ; if too far, execute JumpDash

Sonic_JD_InitHoming:
   move.b #$3C,$001F(a0) ; set count of frames for Homing Attack
   move.b #$02,($FFFFFFEB).w ; current STATE = HOMING
   move.w #$00BC,d0 ; select JD sound
   jmp (PlaySound_Special).l ; play JD sound

Sonic_JD_GoodObject:
   lea Sonic_JD_ObjectsDB,a2 ; get address of Objects' database
   move.b (a1),d0 ; get number of current Object

Sonic_JD_IsObjectInTheDB:
   cmp.b (a2)+,d0 ; if object number is there in the database
   beq.b Sonic_JD_GetDX ; if yes, calculate DX
   bhi.b Sonic_JD_IsObjectInTheDB ; else, repeat
   bra.w Sonic_JD_NextObject

Sonic_JD_GetDX:
   move.w $0008(a1),d1 ; get X-position of Object
   sub.w $0008(a0),d1 ; minus X-position of Sonic
   bpl.b Sonic_JD_ObjectToTheRight

Sonic_JD_ObjectToTheLeft:
   btst #0, $0022(a0) ; if Sonic looks left
   beq.w Sonic_JD_NextObject ; if not, go to the next Object
   bra.b Sonic_JD_GetDY

Sonic_JD_ObjectToTheRight:
   btst #0,$0022(a0) ; if Sonic looks right
   bne.w Sonic_JD_NextObject ; if not, go to the next Object

Sonic_JD_GetDY:
   move.w $000C(a1),d2 ; get Y-position of Object
   sub.w $000C(a0),d2 ; minus Y-position of Sonic

Sonic_JD_ChkClosestObject:
   muls.w d1,d1 ; DX^2
   muls.w d2,d2 ; DY^2
   add.l  d1,d2 ; DX^2+DY^2
   cmp.l  d3,d2 ; compare distanсes
   bcc.w Sonic_JD_NextObject

Sonic_JD_SetClosestObject:
   move.l d2,d3 ; set current Object as closest
   move.w a1,$003A(a0) ; set current Object for Homing Attack
   bra.w Sonic_JD_NextObject

; database of valid objects to do homing attack with
; numbers MUST BE in ascending order
Sonic_JD_ObjectsDB: dc.l $1E1F2226, $2B2C2D40, $42435055, $6078FF00

Sonic_JD_ExecJumpDash:
   tst.b ($FFFFFFEB).w ;if STATE == JUMPDASH
   bne.w Sonic_JD_Rts ; if not, branch
   move.b #$01,($FFFFFFEB).w ; current STATE = JUMPDASH
   move.w #$0A00,d0 ; set X-velocity to $A00
   btst #6,$22(a0) ; is Sonic underwater?
   beq.w Sonic_JD_ChkShoes
   move.w #$0600,d0 ; if underwater, set X-velocity to $60

Sonic_JD_ChkShoes:
   tst.b ($FFFFFE2E).w ; does Sonic have speed shoes?
   beq.w Sonic_JD_ChkOrientation ;
   addi.w #$0200,d0 ; set speed to $C00 or $800 if underwater

Sonic_JD_ChkOrientation:
   btst #0,$0022(a0) ; where Sonic looks to?
   beq.w Sonic_JD_SetSpeed; if not to right, then
   neg.w d0 ; reverse X-velocity

Sonic_JD_SetSpeed:
   move.w d0,$0010(a0) ; SET X-velocity
   move.w d0,$0014(a0) ; SET Ground-velocity
   move.w #$0000,$0012(a0) ; SET Y-velocity
   move.w #$00BC,d0 ; select JD sound
   jsr (PlaySound_Special).l ; play JD sound

Sonic_JD_Rts:
   rts

Sonic_JD_StopHoming:
   cmpi.b #$02, ($FFFFFFEB).w ; if STATE == JUMPDASH
   bne Sonic_JD_StopHoming_Rts ; if not, branch
   clr.b ($FFFFFFEB).w ; STATE = NORMAL
   move.w #$FA10,d0 ; set Y-velocity to -5F0
   btst #6,$22(a0) ; is Sonic underwater?
   beq Sonic_JD_StopHoming_ChkShoes
   move.w #$FCE0,d0 ; if underwater, set X-velocity to -320

Sonic_JD_StopHoming_ChkShoes:
   tst.b ($FFFFFE2E).w ; does Sonic have speed shoes?
   beq Sonic_JD_StopHoming_SetSpeed
   move.w #$F9E0,d0 ; set X-velocity to -620

Sonic_JD_StopHoming_SetSpeed:
   move.w #$0000,$0010(a0) ; SET X-velocity
   move.w d0,$0012(a0) ; SET Y-velocity

Sonic_JD_StopHoming_Rts:
   rts
 

 

 

В секции Sonic_ResetOnFloor в самое начало добавляем:

 


   clr.b ($FFFFFFEB).w ; STATE = NORMAL
 

 

 

Далее переходим к loc_1AF1E и после "addq.b #2,$24(a1)" вписываем:

 


   jmp Sonic_JD_StopHoming
 

 

 

И, наконец, в секции loc_1AF9C после "bsr.w AddPoints" вставляем:

 


   jsr Sonic_JD_StopHoming
 

 

 

Откомпилируйте и проверьте - работает!

 

Каждый кадр, покамест ёжик крутится в воздухе, процессор непроизвольно переходит по нашей ссылке, в который вписан практически весь сценарий выполнения усовершенствованного JumpDash'а.

Первой миссией нашей программы становится поиск объектов, удовлетворяющих следующим требованиям:

1) объект входит в список целей, разрешённых для выполнения самонаводящейся атаки.

Этот пункт можно отредактировать, изменив байты в следующем участке нашего кода:

 


Sonic_JD_ObjectsDB: dc.l $1E1F2226, $2B2C2D40, $42435055, $6078FF00
 

 

Здесь 1E, 1F, 22, 26, 2B, 2C и т.д. - это т.н. номера объектов, характеризующие вид объекта. К примеру 22 - это летающие осы. Какой номер что означает можно узнать из программы SonED2.

По умолчанию установлено 14 объектов. Вы можете увеличить их количество добавлением новых dc.l, dc.w, dc.b - как угодно, на ваше усмотрение.

Последний байт (00) ни в коем случае не менять. Программа должна знать, где закончить.

ВНИМАНИЕ! Байты должны идти в строго возрастающем порядке.

2) объект находится в поле зрения Ёжика, а не за ним.

 

Далее находится расстояние от Соника до объекта (точнее, квадрат расстояния) и сравнивается с кратчайшим расстоянием, таким образом вычисляется ближайший к герою объект.

Если таких объектов поблизости нет, выполняется старый добрый JampDash. В противном случае записываем адрес объекта-цели в память и каждый кадр будем менять положение Соника по отношению к врагу в сторону сближения, чтобы в конце концов уничтожить последнего. Это и есть самонаводящаяся атака. Сближение по умолчанию производится в течение 31 кадра, после чего эта особенность отключается. Тем не менее, этого достаточно, чтобы провести молниеносную атаку. При столкновении с целью или препятствием, самонаводящаяся атака также отключается.

 

Надеюсь, мой гайд окажется полезным.

Как сделать так, чтоб Соник не целился на врага, который за стеной или как сделать так, чтоб он целился на Эггмана?

Изменено пользователем Какой-то чел

Поделиться сообщением


Ссылка на сообщение

У меня вопрос. Как поменять Title Screen в Sonic 1 Наверное кто то задавал этот вопрос. 

Так что жду ответа (если надо удалю)

Поделиться сообщением


Ссылка на сообщение
В 23.01.2023 в 19:35, Komputersem2165 сказал:

Кто-нибудь подскажет, почему у меня чекпоинт стал невидимым?!

Скорее всего, испортились маппинги.

Поделиться сообщением


Ссылка на сообщение
В 04.02.2023 в 15:25, Henry Sonic Community сказал:

У меня вопрос. Как поменять Title Screen в Sonic 1 Наверное кто то задавал этот вопрос. 

Так что жду ответа (если надо удалю)

https://sonicresearch.org/community/index.php?threads/sonic-1-alternate-title-screen.274/

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×