Перейти к содержимому
⭐️ Форум Sonic World
DELETED

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

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

Разве это баг, а не фича? 

Почему это должно быть фичей?

  • Лайк 1

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


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

По-моему логично, что, если Соник со всей скорости врежется в катеркиллера, то заденет колючки.

  • Лайк 1

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


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

По-моему логично, что, если Соник со всей скорости врежется в катеркиллера, то заденет колючки.

Но он же при этом вращается в клубке. Хотя, в данном случае однозначно ничего сказать нельзя.

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


Ссылка на сообщение
Но он же при этом вращается в клубке

 

Даже если соник вращается в клубке и заденет колючки - он потеряет кольца.

  • Лайк 2

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


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

Даже если соник вращается в клубке и заденет колючки - он потеряет кольца.

Но Катеркиллер всё-таки бадник, а не колючки, а бадников Соник в таком состоянии уничтожает.

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


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

Простой гайд.
Автовключение Level Select в Sonic 2 SMS
 
Зачем? Ну, дело в том, что в S2SMS это геморрой полный, а при хакинге это очень надо.
 
Ищем в /src/s2.asm этот код:
 

LABEL_24BE_48:
    ;check for level select trigger
    ld    a, (LevelSelectTrg)
    cp    $0D
    jr    nz, +
    xor   a
    ld    ($D294), a
    call  LevelSelectMenu     ;run the level select
    call  PaletteFadeOut
    ld    b, $2A
-:  ei
    halt
    djnz  -
+:  xor     a
    ld    ($D292), a
    ld    (GlobalTriggers), a
    ret

И заменяем на:
 

LABEL_24BE_48:
    ;check for level select trigger
    call  LevelSelectMenu     ;run the level select
    ;ld    a, (LevelSelectTrg)
    ;cp    $0D
    ;jr    nz, +
    ;xor   a
    ;ld    ($D294), a
    ;call  LevelSelectMenu     ;run the level select
    call  PaletteFadeOut
    ld    b, $2A
-:  ei
    halt
    djnz  -
+:  xor     a
    ld    ($D292), a
    ld    (GlobalTriggers), a
    ret
  • Лайк 2

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


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

Пилю дополнение к гайду владиккомпера по PeelOut'у.

 

Как сделать бег Соника как в Sonic CD, или же PeelOut с анимацией пробежки.

 

Основу можно посмотреть в теме про PSC.

 

 

Буду продолжать гайд, будто он один, не разделён.

Нужно копировать не много спрайтов Peel Out'а и вставить их в artunc\sonic.bin через SonMapED.

 

 

После этого мы создаём ещё одну анимацию и называем к примеру: SSOR, и пишем это после анимации самого PeelOut'а:

SonAni_SSOR:	        dc.b 3, $5E, $5F, $60, $61, $FF

Потом лезем в sonic1.asm и ищем этот код:

loc_13A9C:
        lea    (SonAni_Run).l,a1; use    running    animation
        cmpi.w    #$600,d2; is Sonic at running speed?
        bcc.s    loc_13AB4; if yes, branch
        lea    (SonAni_Walk).l,a1; use walking animation

И перед этим:

        lea    (SonAni_Run).l,a1; use    running    animation

Пишем это:

		lea	(SonAni_SSOR).l,a1
		cmpi.w	#$A00,d2	; is Sonic at running speed?
		bcc.s	loc_13AB4	; if yes, branch

Потом вы можете откомпилировать РОМ и проверить. Всё работает замечательно.

 

Думаю этот гайд кому нибудь пригодится. Надеюсь на это.

It's not working, all what I see it's error :(

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

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


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

It's not working, all what I see it's error :(

Пилл аут в это туториале работает! Ты наверно в Obj01_MdNormal забыл написать bsr.w Sonic_SpeelOut

 

Или ты забыл сделать спрайты с наклоном (нужно ещё спрайты кверх ногами но не влево) 

Изменено пользователем TishaKot

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


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

Как сделать Сонику напарника  (Тейлза) в Sonic 1

Нужно портировать графику Тейлза и его объект из Sonic 2, параллельно подстраивая под новый движок.

  • Лайк 1

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


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

Как добавить персонажа чтобы поменяласть также и табличка и надпись has passed и иконка жизни?

  • Лайк 1
  • Дизлайк 1

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


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

Как убрать Air Speed Cap в Sonic 2

 

 Идём к Sonic_ChgJumpDir и удаляем эти строки 

    move.w    d1,d0    ; limit speed in air going left, even if Sonic was already going faster (speed limit/cap) 

И строку

  move.w    d6,d0    ; limit speed in air going right, even if Sonic was already going faster (speed limit/cap)

У ВладикаКомпера этот гид глючный (эффект ветра) и я решил написать свой

Speed Cap это скоростной барьер который замедляет Соника в Воздухе

Изменено пользователем TishaKot
  • Лайк 2
  • Дизлайк 2

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


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

Что-ж, решил я написать свой простой и понятный гид, надеюсь он сможет ХОТЬ КОМУ-ТО помочь.

 

Как починить петли в уровнях.

 

Если вы когда-нибудь переделывали Грин Хилл, то могли заметить, что если поставить мертвую петлю на уровень, то Соник пробегает сквозь неё. Как это исправить? Выхода два:

 

Способ 1.

 

Это самый лёгкий способ, нужно найти готовый чанк с петлёй (вроде той, что Сониктимовцы поставили в конец первого акта) и скопировать, дальше просто ставим на нужное место. Но что делать, если вы переделали уровень под корень, или там нет петли? Тут нам поможет второй способ.

 

Способ 2.

 

ВНИМАНИЕ! Я пробовал только в S1LE. Насчёт других редакторов не знаю точно, но по идее должно быть примерно так-же.

 

Причина "сломанности" петли - неправильный тип чанка. Чтобы это исправить нужно нажать ПКМ, выбрать вкладку "Тип" и нажать "Петля". Всё, проблема исправлена! Удачи в построении уровней! Всем печенек! :3

 

P.S. Надеюсь, теперь я не увижу хаков со сломанной петлёй.

  • Лайк 3

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


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

Многие начинающие ромхакеры , глядя на папку с исходником , наверняка видели там файл macro.asm  , но либо не задумывались о его значении , либо просто не находили ответа на этот вопрос. Итак , давайте разложим всё по полочкам.

Для начала , давайте разберёмся : Что же такое макрос ?

Макрос – это определённый набор кода , который можно вызвать одной командой.
Макросы могут находиться как в macro.asm , так и в самом исходном коде.

Рассмотрим применение макросов на примере добавления эффекта вспышки перед боссом:

Итак , для начала нам необходимо открыть sonic1.asm , и найти там :

 

Resize_GHZ3boss:
		cmpi.w	#$960,($FFFFF700).w
		bcc.s	loc_6EB0
		subq.b	#2,($FFFFF742).w

loc_6EB0:
		cmpi.w	#$2960,($FFFFF700).w
		bcs.s	locret_6EE8
		bsr.w	SingleObjLoad
		bne.s	loc_6ED0
		move.b	#$3D,0(a1)	; load GHZ boss	object
		move.w	#$2A60,8(a1)	; X-position
		move.w	#$280,$C(a1)	; Y-position

loc_6ED0:
		move.w	#$9C,d0
		bsr.w	PlaySound	; play boss music
		move.b	#1,($FFFFF7AA).w ; lock	screen
		addq.b	#2,($FFFFF742).w
		moveq	#$11,d0
		bra.w	LoadPLC		; load boss patterns



Здесь  нам  понадобиться изменить только 1 лок , а именно :
 

loc_6ED0:
		move.w	#$9C,d0
		bsr.w	PlaySound	; play boss music
		move.b	#1,($FFFFF7AA).w ; lock	screen
		addq.b	#2,($FFFFF742).w
		moveq	#$11,d0
		bra.w	LoadPLC		; load boss patterns



Итак , добавляем  после  bsr.w              PlaySound          ; play boss music  следующий код:

                            

                             jsr	(Pal_MakeWhite).l   ;  вспышка
                             jsr	(Pal_FadeTo).l  ; выход из вспышки



Компилируем , проверяем. Если всё работает , то читаем дальше.

Итак , давайте разберемся , что же мы именно сделали.


 

jsr           (Pal_MakeWhite).l   ;  вспышка 



Этот макрос вызывает непосредственно вспышку : Экран становится белым , управление персонажем отключается. Но как же тогда мы будем сражаться с боссом? Надо как-то выйти из такого состояния , и в этом нам поможет…

 

jsr           (Pal_FadeTo).l  ; выход из вспышки



Этот макрос следует использовать только после макросов , вводящих Соника во вспышку. Он выводит их из него.

Итак , мы разобрались с использованием макросов из исходника.

Теперь попробуем использовать макрос из
macro.asm

Итак , допустим , вы хотите , чтобы при появлении босса не только была вспышка , но ещё и ускорялась музыка. В этом нам помогут макросы от товарища Савватеева , предусмотрительно добавленные мной в исходник Romhacker Starter Pack

Итак , открываем  macro.asm  и находим там :

 

SpeedUp                             macro
                               move.b                #$E2,d0
                               jsr                          PlaySound_Special
                               endm



Из всего этого нам понадобиться только  SpeedUp
Это – название макроса.
Итак ,  переходим к уже знакомым нам:



                           

                             jsr             (Pal_MakeWhite).l   ;  вспышка

                             jsr             (Pal_FadeTo).l  ; выход из вспышки



И добавляем перед ними:

                          

   SpeedUp ; Заюзать макрос


Весьма просто , не правда ли?
Компилируем , проверяем.

А теперь , попробуем написать свой собственный макрос!

Итак  , чтобы каждый раз не писать один и тот же код , при появлении босса  ,давайте напишем свой собственный макрос.
Открываем
macro.asm и в самый конец вставляем:







 

; =============================================================

; Новый макрос!

; -------------------------------------------------------------

BossAppear       macro

                               SpeedUp ; Заюзать макрос

                               jsr           (Pal_MakeWhite).l   ;  вспышка

                            jsr              (Pal_FadeTo).l  ; выход из вспышки

endm


Сохраняем , и  снова открываем  sonic1.asm .
Находим там :

                         

       SpeedUp ; Заюзать макрос

                               jsr           (Pal_MakeWhite).l   ;  вспышка

                            jsr              (Pal_FadeTo).l  ; выход из вспышки


И заменяем на:


             

BossAppear ; Заюзать макрос




Как всегда , компилируем и проверяем , всё ли работает.

Ну а теперь , давайте разбираться : Что же мы собственно сделали?

Итак , сначала рассмотрим вот этот код:

; =============================================================

; Новый макрос!

; -------------------------------------------------------------

BossAppear       macro


BossAppear  - это название макроса , которое будет использоваться для его вызова
macro идентифицирует этот код как макрос

Теперь переходим непосредственно , к содержанию макроса:
                         

    SpeedUp ; Заюзать макрос

                               jsr           (Pal_MakeWhite).l   ;  вспышка

                            jsr              (Pal_FadeTo).l  ; выход из вспышки


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

Ну и наконец :


endm – эта команда всегда ставится в конце макроса , и является его завершением

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

 

Изменено пользователем Rеb Brown

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


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

Мой туториал "как  добавить выбор уровней из соника 2 в соник 1" (Он полностью работает).

Скачиваем "s2menu.rar" (он снизу) и разархивируем в свой дизассембл.

Теперь добавляем выбор уровней в игру:

заходим в "sonic1.asm",

Идём в конец и видим:

; end of 'ROM'
EndOfRom:


		END

добавляем над этим кодом вот эту строчку:

 include "s2_menu.asm" ; Sonic 2 Level Select

Теперь ищем вот это:

Title_ChkLevSel:
		tst.b	($FFFFFFE0).w		; check	if level select	code is	on
		beq.w	PlayLevel		; if not, play level
		btst	#iA,(Joypad|Held).w	; check if A is held
		beq.w	PlayLevel		; if not, play level
		moveq	#2,d0
		bsr.w	PalLoad2		; load level select pallet
		lea	($FFFFCC00).w,a1
		moveq	#0,d0
		move.w	#$DF,d1

и заменяем на это

Title_ChkLevSel:
		tst.b	($FFFFFFE0).w		; check	if level select	code is	on
		beq.w	PlayLevel		; if not, play level
		btst	#iA,(Joypad|Held).w	; check if A is held
		beq.w	PlayLevel		; if not, play level
		jmp     Level_Select_Menu ; if yes, goto Sonic 2 level select
		moveq	#2,d0
		bsr.w	PalLoad2		; load level select pallet
		lea	($FFFFCC00).w,a1
		moveq	#0,d0
		move.w	#$DF,d1

Выбор уровней добавлен!

Теперь заходим в "_inc\Pallet Pointers.asm"

и добавляем в самый низ вот это:

    dc.l Menu_Palette
    dc.w $FB00
    dc.w $1F

Теперь заходим в "s2_menu.asm" и ищем:

Menu_Level_Select_Text: 
                dc.b    $0E, _G, _R, _E, _E, _N, __, _H, _I, _L, _L, __, __, __, __, __
                dc.b    $0E, _L, _A, _B, _Y, _R, _I, _N, _T, _H, __, __, __, __, __, __
                dc.b    $0E, _M, _A, _R, _B, _L, _E, __, __, __, __, __, __, __, __, __
                dc.b    $0E, _S, _P, _R, _I, _N, _G, __, _Y, _A, _R, _D, __, __, __, __
                dc.b    $0E, _S, _T, _A, _R, __, _L, _I, _G, _H, _T, __, __, __, __, __
                dc.b    $0E, _S, _C, _R, _A, _P, __, _B, _R, _A, _I, _N, __, __, __, __
                dc.b    $0E, _F, _I, _N, _A, _L, __, __, __, __, __, __, __, __, __, __   
                dc.b    $0E, _S, _P, _E, _C, _I, _A, _L, __, _S, _T, _A, _G, _E, __, __
                dc.b    $0E, _E, _N, _D, _I, _N, _G, __, _S, _E, _Q, _U, _E, _N, _C, _E
                dc.b    $0E, _S, _O, _U, _N, _D, __, _T, _E, _S, _T, __, __, _st,__, __              

теперь изменяем тексты...

Видите в начале "s2_menu.asm" вот эти строчки?

Level_Select_Menu_snd   = $0081
Emerald_Snd             = $0093
Ring_Snd                = $00B5
Volume_Down             = $00E0
Stop_Sound              = $00E4

Я скажу что они делают:

Level_Select_Menu_snd   = $0081 ; Это музыка в выборе уровней
Emerald_Snd             = $0093 ; Это звук после наведения кода на все изумруды
Ring_Snd                = $00B5 ; Это звук после кода на Debug
Volume_Down             = $00E0 ; Это НЕ трогать)
Stop_Sound              = $00E4 ; Это тоже))

Всё! Легко не правда ли?

s2menu.rar

Изменено пользователем Tihon12
  • Лайк 2

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


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

Ещё один гайд от меня :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

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

  • Лайк 1

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


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

Ещё 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

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


Ссылка на сообщение
В 07.01.2010 в 16:28, Alexey383 сказал:

чёт вы не в тему)) есть же тема "Ваши хаки")) в ней бы лучше спрашивать))

привет

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


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

Гайд по добавлению обновлённого 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.

  • Лол 1
  • Дизлайк 2

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


Ссылка на сообщение
В 23.12.2019 в 14:48, krolik228serbia сказал:

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

 

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

Выглядит как очень толстый троллинг, Влад перелогинься

  • Лайк 1

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


Ссылка на сообщение
В 03.12.2017 в 10:21, DelayHacks сказал:

Ещё 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

Извини но код не работает, попробуй компилировать через powershell

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


Ссылка на сообщение
В 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 кадра, после чего эта особенность отключается. Тем не менее, этого достаточно, чтобы провести молниеносную атаку. При столкновении с целью или препятствием, самонаводящаяся атака также отключается.

 

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

×