-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpatch.asm
342 lines (274 loc) · 10.3 KB
/
patch.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
; MEMORY: ------------------------------------------------------------------------------------------
; Mega CD MMIO addresses used for communicating with msu-md driver on the mega cd (mode 1)
MSU_COMM_CMD equ $a12010 ; Comm command 0 (high byte)
MSU_COMM_ARG equ $a12011 ; Comm command 0 (low byte)
MSU_COMM_CMD_CK equ $a1201f ; Comm command 7 (low byte)
MSU_COMM_STATUS equ $a12020 ; Comm status 0 (0-ready, 1-init, 2-cmd busy)
; Where to put the code
ROM_END equ $3ff49a
; Variables
victory equ $fffffefe
stage equ $ffffaabc
enemy_encounter equ $ffffaaba
; MSU COMMANDS: ------------------------------------------------------------------------------------------
MSU_PLAY equ $1100 ; PLAY decimal no. of track (1-99) playback will be stopped in the end of track
MSU_PLAY_LOOP equ $1200 ; PLAY LOOP decimal no. of track (1-99) playback will restart the track when end is reached
MSU_PAUSE equ $1300 ; PAUSE vol fading time. 1/75 of sec. (75 equal to 1 sec) instant stop if 0 pause playback
MSU_RESUME equ $1400 ; RESUME none. resume playback
MSU_VOL equ $1500 ; VOL volume 0-255. set cdda volume
MSU_NOSEEK equ $1600 ; NOSEEK 0-on(default state), 1-off(no seek delays) seek time emulation switch
MSU_PLAYOF equ $1a00 ; PLAYOF #1 = decimal no. of track (1-99) #2 = offset in sectors from the start of the track to apply when looping play cdda track and loop from specified sector offset
; MACROS: ------------------------------------------------------------------------------------------
macro MSU_WAIT
.\@
tst.b MSU_COMM_STATUS
bne.s .\@
endm
macro MSU_COMMAND cmd, param
MSU_WAIT
move.w #(\1|\2),MSU_COMM_CMD ; Send msu cmd
addq.b #1,MSU_COMM_CMD_CK ; Increment command clock
endm
; MEGA DRIVE OVERRIDES : ------------------------------------------------------------------------------------------
; M68000 Reset vector
org $4
dc.l ENTRY_POINT ; Custom entry point for redirecting
org $200 ; Original ENTRY POINT
Game
jsr restart
; Vars
org $12738
jmp init_vars
init_vars_return
; Original play_music_track sub routine
org $1faf44
jmp play_music_track
; Game over
org $30972e
jmp play_game_over
org $30973e
rts
; Continue
org $232cd0
rept 9
nop
endr
jsr play_continue
; Title screen
org $2328fa
jsr play_title_screen
; Goro lives
org $232b02
jsr play_goro_lives
org $232b08
moveq #-1,d3
; Override pit bottom to the hall/throne room
org $548
dc.w $0050
org $566
dc.w $0053
; Victory
org $233572
jsr play_victory
org $309f3e
moveq #-1,d3
org $309f5e
moveq #-1,d3
org $309f7e
moveq #-1,d3
org $308f90
moveq #-1,d3
org $308e56
moveq #-1,d3
; Remap test your might
org $2329e0
moveq #$7f,d0
; Ermac
org $19e81a
nop ; Restore original stage music
nop
nop
org $234432 ; Replace Ermac intro sound with title screen instead of "choose your fighter"
jsr play_title_screen
org $2344a2
nop
nop
nop
; enemy encounter id
org $62f4
jmp increment_enemy_encounter
; Goro crash fix
org $62a0
move sp,usp
org $62ac
move usp,sp
org ROM_END
ENTRY_POINT
bsr audio_init
jmp Game
; MSU-MD Init: -------------------------------------------------------------------------------------
align 2
audio_init
bsr msu_driver_init
tst.b d0 ; if 1: no CD Hardware found
.audio_init_fail
bne .audio_init_fail ; Loop forever
MSU_COMMAND MSU_NOSEEK, 1
MSU_COMMAND MSU_VOL, 255
rts
; Sound: -------------------------------------------------------------------------------------
align 2
init_vars
lea victory,sp
sf (sp)
jmp init_vars_return
restart
MSU_COMMAND MSU_PAUSE, 0
; Run original code
tst.l $a10008
rts
play_game_over
MSU_COMMAND MSU_PLAY,18
rts
play_continue
MSU_COMMAND MSU_PLAY,20
rts
play_victory
st victory
MSU_COMMAND MSU_PLAY,21
rts
play_title_screen
MSU_COMMAND MSU_PLAY,22
rts
play_goro_lives
MSU_COMMAND MSU_PLAY,23
rts
increment_enemy_encounter
addq.w #1,enemy_encounter
cmp.w #$0b,enemy_encounter
bne .ok
jsr play_goro_lives ; For first Goro encounter
.ok
jmp $5cbc
play_music_track
; If in victory mode, skip other tracks
tst.b victory
beq .check_finish_him
clr.w d0
bra .original_code
.check_finish_him
; If "Finish Him" play stage specific variant
cmp.b #$55,d0
bne .check_goro_shang_tsung
move.l a0,-(sp)
move.w stage,d0
add.w d0,d0
lea AUDIO_TBL_FINISH_HIM,a0
move.w (a0,d0),d0
movea.l (sp)+,a0
MSU_WAIT
move.w d0,MSU_COMM_CMD
addq.b #1,MSU_COMM_CMD_CK
clr.w d0 ; Run stop command for original driver
bra .original_code
.check_goro_shang_tsung
; Goro's Lair song requested?
cmp.b #$0b,d0
bne .check_stop
; For Goro fight?
cmp.w #$0b,enemy_encounter
beq .fight_goro
; For Shang Tsung fight?
cmp.w #$0c,enemy_encounter
bne .check_stop
MSU_COMMAND MSU_PLAY,24
clr.w d0 ; Run stop command for original driver
bra .original_code
.fight_goro
jsr play_goro_lives
clr.w d0 ; Run stop command for original driver
bra .original_code
.check_stop
; If cmd 0... stop
tst.b d0 ; d0 = track number
bne .start_track_search
; 0 = Stop
MSU_COMMAND MSU_PAUSE, 0
bra .original_code
.start_track_search
; Save used registers
movem.l d1-d2/a0,-(sp)
lea AUDIO_TBL(pc),a0
moveq #((AUDIO_TBL_END-AUDIO_TBL)/2)-1,d1
.find_track_loop
move.w d1,d2
add.w d2,d2
move.w (a0,d2),d2
cmp.b d2,d0
bne .next_track
; Set cd track number
move.b d1,d2
addq.b #1,d2
; Send play command
MSU_WAIT
move.w d2,MSU_COMM_CMD
addq.b #1,MSU_COMM_CMD_CK
; Run stop command for original driver
clr.w d0
bra .play_done
.next_track
dbra d1,.find_track_loop
; If no matching cd track found run original track
; First stop any still playing cd track
MSU_COMMAND MSU_PAUSE, 0
.play_done
; Restore used registers
movem.l (sp)+,d1-d2/a0
jmp .original_code
.original_code
addq.w #1,d0
move.w d0,($fa42).w
st ($fad4).w
sf ($faa6).w
clr.b ($face).w
clr.w ($fa3e).w
clr.w ($fa40).w
sf ($fa62).w
rts
; TABLES: ------------------------------------------------------------------------------------------
align 2
AUDIO_TBL
; # Command|id # Track Name
dc.w MSU_PLAY_LOOP|$02 ; 01 - Choose Your Fighter
dc.w MSU_PLAY_LOOP|$0f ; 02 - Courtyard
dc.w MSU_PLAY|$1d ; 03 - Courtyard Victory
dc.w MSU_PLAY_LOOP|$1e ; 04 - Entrance
dc.w MSU_PLAY|$2f ; 05 - Entrance Victory
dc.w MSU_PLAY_LOOP|$30 ; 06 - Warriors Shrine
dc.w MSU_PLAY|$3e ; 07 - Warriors Shrine Victory
dc.w MSU_PLAY_LOOP|$3f ; 08 - The Pit
dc.w MSU_PLAY|$4f ; 09 - The Pit Victory
dc.w MSU_PLAY_LOOP|$0b ; 10 - Goro's Lair
dc.w MSU_PLAY|$52 ; 11 - Goro's Lair Victory
dc.w MSU_PLAY_LOOP|$50 ; 12 - The Hall
dc.w MSU_PLAY|$53 ; 13 - The Hall Victory
dc.w MSU_PLAY|$0a ; 14 - 2 Player Versus
dc.w MSU_PLAY|$7f ; 15 - Test Your Might
dc.w MSU_PLAY_LOOP|$04 ; 16 - Bio Screen
dc.w MSU_PLAY_LOOP|$08 ; 17 - Battle plan
dc.w MSU_PLAY_LOOP|$ff ; 18 - Game Over (Unmapped)
dc.w MSU_PLAY|$54 ; 19 - Fatality
AUDIO_TBL_END
AUDIO_TBL_FINISH_HIM
dc.w MSU_PLAY|25 ; Courtyard - Finish Him
dc.w MSU_PLAY|26 ; Entrance - Finish Him
dc.w MSU_PLAY|27 ; Warriors Shrine - Finish Him
dc.w MSU_PLAY|28 ; The Pit - Finish Him
dc.w MSU_PLAY|29 ; The Hall - Finish Him
dc.w MSU_PLAY|27 ; Goro's Lair - Finish Him
dc.w MSU_PLAY|29 ; Pit bottom - Finish Him
AUDIO_TBL_FINISH_HIM_END
; MSU-MD DRIVER: -----------------------------------------------------------------------------------
align 2
msu_driver_init
incbin "msu-drv.bin"