EMU618社区

 找回密码
 立即注册
搜索
查看: 532|回复: 1

[原创HACK教程] [FC教程][最终任务][修改实例]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
' m( m4 E4 s$ I, ]! V: d  f! I$ P. i- k4 C% ~0 `0 x0 @6 f
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
) c! S# ^, b1 {# D5 Y) X然而,今天想到一个思路.
; [4 P" z" O/ Z& n+ H1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
4 Z/ g& S- Y, P6 h& \; _2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
' g4 A' e* y5 b! }5 g3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
  H: o" C/ k7 Q# Z3 j
" G+ Y5 u( g8 Z5 H3 j" w) {; c& j) y* C7 T/ y  u
;[FC][最终任务KEY][END]# f5 [& K. ]/ s3 ]  J
button = $04    ;单次按键
7 ]) U% _0 M6 Z( A, F' wflag = $6000    ;功能开关标志7 v# z" f, w. @  U+ F! ~: s9 u6 W
pause = $000E   ;暂停地址+ p$ b6 Y8 `. x7 C* Z, p

: x* J/ q0 ~1 `2 G .ORG $8000
) o9 k" l, x" L4 l$ j LDY #$08    ;自带的按键程序& o; _" Q5 B8 `$ ]+ n
ADDR8002:
, V( f- P, g+ P: S6 _+ a LDA $4016,X
+ Q( ~8 r$ T1 |7 Z7 j6 U" B& T: `8 g LSR! ?0 w! `( p3 o' f' W6 o
ROL $00214 ^$ w6 O: ~( K  O/ s; N
LSR
" G: _3 ]3 B% {/ @5 j8 L ROL $0029
$ Y' E& d( z# U( x DEY# y2 V% N# C1 ?+ Y
BNE $80024 s, ~) A4 w1 P3 D+ c, _
LDA $0021+ ]# V# E6 J! h/ ?2 D
ORA $0029
( w6 h+ @, v* p% P; W* ]/ L9 I STA $0021
/ ]# m7 S3 G; F% y6 h3 D: U7 f LDA $0020
/ m" V* }0 J1 y- M* X AND $00216 \+ v0 Q+ t/ {) K3 ?/ T; O7 U
STA $0020- }  M/ Z' u5 K0 h  g; B
LDA $06,X
4 S& j  U2 C. H# x* _) l8 }9 z) T0 | EOR $0020% Q- G$ H: n" V& i7 M
AND $0020( ?5 S# A& r# ]
STA $04,X5 V% w: a7 W6 W% o$ f/ F: D
LDA $0020; ^, Z6 `' H. a+ Y3 m7 v
STA $06,X
5 d  w8 z3 Z" v8 {- B JSR KEY_OPERATE
$ b9 J5 |) H: w5 {2 G+ F- _7 v JSR Function    ;功能调用" Q( m3 T1 O! C' c9 \) A% X* O
JSR Weapon    ;武器切换调用
! D/ r5 f5 z1 d. x6 s* U JSR Power    ;威力调用
* d/ q/ N4 z# e, X, G/ S JSR BULLET_NUM    ;子弹数目
2 m& N5 g6 z2 j3 j& f3 G JSR BULLET    ;副武器类型# N. Y# U+ N5 O; _
RTS
2 }( K, L$ y1 }3 k9 B! d
5 |8 s9 r% Z/ F$ k1 N# e8 T3 M - R3 A7 l* Z5 D

- M0 u% c- o$ T1 o  J, J .ORG $8050
' G5 W: J2 {. i4 T, k$ LFunction:    ;功能
) e! m$ V" n1 H7 D' UWUDI:    ;无敌, r; e1 a6 j2 r. a0 L
LDA $6000,X
! L& G. G5 N0 }! _  C AND #$08    ;开关判断
+ l1 W$ ?- k3 d BEQ LIFE
  c2 B& ?" u8 a- B& N LDA #$05
5 ?9 K! p: b0 y) d) P STA $05DC,X    ;无敌锁定
1 b& U2 m& A2 p, H+ xLIFE:    ;生命' n, a* f; `! J, o( y
LDA $6000,X
6 H2 v8 C4 G' L7 D5 R AND #$04    ;开关判断
1 m* ^0 K) N6 M4 u8 W BEQ FUNRTS
. I' m9 T( X! u# H# @# q5 ? LDA #$05
- {$ M/ L# \5 y1 x' c7 T. E STA $1C,X    ;生命赋值
1 D7 @) q% g; G6 ]FUNRTS:
9 {0 l& L  v( r RTS
! c& \# g% R7 ~& x
: s( C) R4 y" B6 j* IWeapon:    ;武器切换* n2 O9 e; I/ [% J
LDA pause    ;暂停状态判断
' h1 q2 c2 W, @ BNE WEARTS
' h+ [# Y+ P( D3 ? LDA $04,X1 l- ?: k+ C* j  L0 w9 Z  R7 W# F0 x
CMP #$20    ;选择键判断
& a: N; [7 v+ P7 d. r: y# b BNE WEARTS
4 w0 c. i! ^/ r: j, M LDA $12,X
6 h9 K, k  ?" \; q( C CMP #$03    ;武器值判断; T8 U6 v8 d) [" b  W
BCC WEAINC
' o" G( T% x* y0 R LDA #$FF
# B( L1 a. e) h: R1 u$ h STA $12,X    ;武器重置
2 N; R7 q8 |. IWEAINC:* {: A5 F/ W5 w/ `0 D) _* Y
INC $12,X    ;武器增加' b4 r% ^. x# N
2 X2 `( ^2 G/ p+ x
WEARTS:
  d+ \$ o4 X# s. E& q RTS$ O; j1 F9 W. e1 \( Y

$ L# H% J6 a$ W' n' ~Power:    ;威力
. I* m' ^* f! R. J5 t LDA pause    ;暂停状态判断
0 u' _9 p  o0 V' x4 ] BEQ SPERTS
# Y* T4 l6 i& ?) HBUT_LEFT:
" h/ Q: W( V1 p, [ LDA $04,X- B. h. \. t. @0 H' I. |
CMP #$02    ;左按键判断: K# o$ g+ l* w
BNE BUT_RIGHT# `8 J% x! I. \0 K0 w
LDA $88,X
: e, t# X+ {0 k+ }! P5 X  ` CMP #$00    ;威力判断# s; u4 ?+ e% r- l* B8 h; Z/ i
BEQ SPERTS+ c" |7 s5 h6 H7 f' C
SPEDEC
$ ^1 g, o. ^  _) J" q# @2 C' _3 G LDA $88,X    ;读取武器值
' S5 ~0 Y, Z9 x' X& }1 u SEC
1 a+ G+ U( E$ p) v3 M/ ? SBC #$08# W# V6 f. Q2 m  b/ g6 R* y
STA $88,X    ;威力减小
/ J3 w) Z- E7 \7 ~BUT_RIGHT:
; x- H, h: q9 a* A) @- W LDA $04,X. R9 x! @4 @8 y( X
CMP #$01    ;右按键判断
7 `- _1 e" U( j' t BNE SPERTS
  e; H% n; }- ~0 l LDA $88,X
; |2 y% P) U' c4 I CMP #$10    ;威力判断- [; e9 Q2 f2 l
BEQ SPERTS
5 g# I9 d8 c1 j6 K2 L1 [& q2 q$ W$ BSPEINC:
8 a9 |; [7 z9 Y; e% u LDA $88,X    ;读取武器值1 i+ n! \& t) Q- {% W2 C
CLC
2 q4 C# Q% g" e# U" x ADC #$08
5 l6 p" o: q0 c6 ?3 a8 s STA $88,X    ;威力增大+ W: b: a+ ]5 f" `
/ Y. M2 f8 _6 J5 f8 A
SPERTS:) F* H8 `! P5 N6 \; n9 S* b
RTS
4 h  h4 k, h9 y9 U/ y+ ^2 |2 o) p; J
BULLET_NUM:    ;子弹数目
- A; O! ^1 Y! D$ s& N1 i LDA pause    ;暂停状态判断5 i4 n) ^  L' U7 c
BEQ BULRTS
7 U* P- [+ B% O9 D$ o" X0 \! [2 [ CPX #$00    ;主机玩家判断
5 y% {" J, q8 z$ s! w5 m BNE BULRTS8 s2 {) A0 o  c! N) z+ M( u# z
LDA $04,X    ;主机玩家判断6 U9 I6 r+ p0 {% Y. x
AND #$80    ;按键A比较$ ?  ?) f$ h& ^
BEQ BULRTS
+ Z) l# s! `0 Y" v) f LDA $87    ;状态判断, {8 z( A% q& i7 {0 S5 c( s! ]* M
BEQ BUL_29 B; c& Q- {+ n
BUL_1:
% s( |2 I0 s- {& y! I LDA #$00
8 l$ M8 j+ w5 ^7 C: L) v5 h STA $87    ;1发子弹
& |$ s& \" _" e2 f4 w6 z BEQ BULRTS. ^6 T9 ~% [  l+ o$ }: ]$ I' a
BUL_2:
" e+ ~7 O9 u; `* Z LDA #$01
; \; [& G' v0 Y7 \7 m STA $87    ;2发子弹
" `& |$ _" T0 w
4 u! m/ z% s3 E9 ZBULRTS:
2 \) |" P/ y# o6 S: }, i RTS
6 T) Q! t) K# J! ]) {1 P
2 l2 }- k  R  U( z0 x
% j' U1 }# J; q7 V1 R% \BULLET:
$ M5 _- K0 p- z- H' V! o) ` LDA pause    ;判断暂停状态& d! l( w; `& a6 S4 ^
BEQ BULLETRTS9 E1 r( b1 e& H5 V/ Q1 G$ P$ m6 i
LDA $04,X
7 F# x+ V/ R- k/ N1 x+ b8 p CMP #$40    ;按键B比较
2 Z  h  V( K* r5 ]3 c5 s1 D, e BNE BULLETRTS+ {9 `5 S) w  J4 U% T( U* {& P
LDA $6002,X    ;读取副武器
3 h$ l2 Y2 V# H$ C$ v CMP #$03- u( Z5 z4 b+ F3 O5 t
BCC BULLETADD! s5 k4 G2 k( T4 q8 c
LDA #$FF
- X2 k- s/ p. V$ P8 g STA $6002,X, k( T/ R7 B2 C- u: }) x
BULLETADD:
6 \  o* {5 ~0 L- N1 U' V; e. _, h- | INC $6002,X/ t9 }- I8 Y" u5 p7 Q

0 `, J* ~! c5 \& vBULLETRTS:
1 V3 a! u: s2 y/ }. i LDA $6002,X; U6 O6 c; P# o! y: S3 \, ^
TAY
4 `5 z: D- ], I* s9 b" |& q# Y4 F LDA BULLET_DATA,Y
) o2 d/ |" g$ Q9 ~5 y6 { STA $6004,X    ;写入副武器数据! l3 ]; N( |0 J0 M
RTS* S, W  ^6 Y4 [

$ e" ^/ ], d; a% y/ c! j : S, A- S+ q: J# _6 E
BULLET_DATA:* }6 j/ n8 M4 b- w) l
.BYTE $06,$02,$03,$04; N5 M% H7 \$ O7 e9 {" _  E* [
0 F8 V8 n- _: h+ _1 _$ f0 }4 [+ q

3 q" b3 L, B) c, H( R1 G( M
) [$ f; S' C; ?4 E1 eKEY_OPERATE:    ;按键开关操作
+ n. m! y# ?" Y7 v8 p0 Gdata_protect:    ;数据保护7 c! o2 r3 G  ^
PHA( x, g" L+ s" m: V' Q
TXA
: \3 B; L, `$ p8 C9 _* ]% ?6 X PHA
0 A: b% u$ q$ T7 G; M TYA- f$ N% h) r! m8 u* d3 S
PHA
3 @# _$ J  S! Y+ i7 [+ s
2 Y2 g4 }/ f- F2 @* f( L# ]7 MFLAG_INI:    ;开关标志初始化
$ u/ a& s" W& ~1 w4 c5 l4 t. @7 Y/ Q+ a5 g" s- o( \6 n: d% f
LDA $600F
$ k- `# ^  M* P* Z0 z. o; s; w3 P' _ CMP #$01/ |3 ]/ l* A8 C
BEQ pause_cmp
( ]8 p; @& v6 k7 P3 u, n LDA #$00
& b5 k+ P7 T3 Y STA $60008 ?1 P7 [$ `% M$ W
STA $6001
5 p" x0 @3 f+ F4 P. Z' U, J STA $6002
  a9 l0 p0 c& l STA $6003# R* c! _/ r/ \( L% G% C# ]% y  t1 S
STA $6004
% [/ n5 b) a# y0 M STA $6005( e/ g7 q8 ]' _3 W/ ~" k
LDA #$01# t" ?/ Z- u2 ^
STA $600F7 [$ o2 i. T) d* `! L$ V6 Q! I

7 h/ `/ d; i0 M  L+ ~3 D( @pause_cmp:    ;判断暂停状态
' @# ^4 {; w$ { LDA pause+ m/ E/ l( p- A6 U/ b( n( F+ S' J
CMP #$01    ;判断暂停状态
/ f6 N2 A( a5 g) J: F BEQ button_press( L! k) @8 i1 f7 Y4 X& g
PLA
( \. o" p. \' Y; _$ R% I TAY
. \% K  ^$ M" n6 a5 T$ L8 d PLA4 H% P- O$ p  B2 _- k+ M$ T. b
TAX2 x; I7 q$ ?5 P- @) K3 M
PLA* B2 H# k) o6 a# Z9 @2 h
RTS
+ }/ C' H1 G' n( ^: L8 E  s
% j. G8 l' \1 q3 ~2 Bbutton_press:    ;按压操作
3 _% @* V2 O: X# {" G! \( Lini_Y:
1 D% x* j5 y; N LDY #$00/ C- x3 q, I8 ^* X
button_cmp:
( A) @- X% x, s( \5 B5 n/ M LDA button,X
; q: _0 P! K1 _# Y& n CMP ora_data,Y
" S+ T( g# a: N. d0 y9 y* M BNE count_Y_cmp8 ^$ H7 _# o+ f0 k; d$ h! h5 U& i+ f
flag_cmp:
) n/ F/ q" J# i: Q# E. |+ |' a3 P: P$ `! _ LDA flag,X
! q4 T! i$ Z( ]1 y AND ora_data,Y
+ r  e$ f3 k6 _/ U( ~* N4 u BNE flag_and5 Y! u! q; P% D: w
flag_ora:
7 {  i0 E+ y" N7 B, p! S2 o LDA flag,X) S$ z9 T  D  }* C4 i9 C9 O9 ]
ORA ora_data,Y
( D! d, f1 ~: R! r- V+ b; R9 D STA flag,X, [  N/ @4 J$ y+ Z: x9 A# [9 y
BNE count_Y_cmp
  P8 @  m- g5 Y4 E* cflag_and:
5 w0 Q. T& y* h: H/ I1 } LDA flag,X8 _! U! i, a& [. n% r/ }! w6 T
AND and_data,Y7 t( W& a5 t/ i5 S! N
STA flag,X
9 `6 E" r: w' j# M5 Ucount_Y_cmp:
* e9 l3 D# Y& {+ _ INY
1 w4 y& j; W. o" V8 z4 a CPY #$08
9 s, P& B4 V. n7 D7 |7 M( t2 T' e BCC button_cmp
7 H0 G7 p% Y2 _- t, u7 B) S 6 W0 n& m0 O( |- L
data_extract:    ;数据恢复& a3 J6 J3 O7 _; i. _9 B1 m6 T
PLA
5 }7 e. ]+ E4 K$ n4 Y; `% }0 O TAY
1 b: I- Q: e7 T1 Q4 O% Z" F PLA
/ Q9 j4 n8 d* E, v& f% b TAX  R) n& {# A. b! q$ y' w- O9 U
PLA
* B* h8 e& C9 S$ D4 a( K
# S4 b! U1 e* }/ [% ~. f( Breturn:6 J: ]) F: A! E5 G2 X
RTS' p" p: g6 V3 G2 E9 u/ o* b7 d+ s# m

6 y+ |5 `/ B4 Hora_data:   ;按键相或数据. U# u% U: Z# q5 t  c
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
7 p: A: l" a+ a/ ]' zand_data:   ;按键相与数据( a  j% r- l' w
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
! x. ^7 l& c5 M9 l6 Y 8 W2 M& p+ {0 h5 v6 k* O( Q

' d- u  `) |/ F  y+ ?+ C* f
6 {) k# T, g4 v1 [. y ;FC数据搬移程序 BY FlameCyclone
0 l" g# w! z- O+ p! N .ORG $8200
, {: }( b* i- h) t7 p+ J JMP DATA_COPY_PROTECT
0 O2 l% K, r4 v
! Q  t7 t* K" [# LADDR_DATA_TO = $40    ;目的地址2 |5 d' x* S" a4 L0 _$ d/ m
ADDR_FROM_START = $42    ;源开始地址7 P6 O1 ]7 R2 s
ADDR_FROM_END = $44    ;源结束地址+ U5 X+ k4 \2 i* x
& z' x( p& u) V" N. s
ADDR_TO:    ;目的地址
) t8 ?6 O  Q1 I: N3 Q7 Z  B) L .BYTE $00,$70# b9 Q; o. I* p
ADDR_BEGIN:    ;源开始地址# k/ z* Z; v, a/ f1 z
.BYTE $00,$83
; d( [2 u, [/ o, Z8 jADDR_END:    ;源结束地址! S3 B1 `+ k" i  S  v" @7 O
.BYTE $FE,$84
. ~+ \6 J5 H: q+ V; X6 y: T; }: |: Y% G
INT_ADDR = $08    ;中断地址$ F( Q+ m% F# ~1 L' l( C
FLAG_OVER = $71FF    ;完成标志" i( j) ]; a" J3 w3 f8 Y
7 {6 @! Q! A$ b

! a2 a% l0 C+ K% QDATA_COPY_PROTECT:    ;保护数据7 X6 I5 C: [5 S0 s9 M: c8 u" u
PHP
6 W6 Z3 _) A" V. m  i7 y- B PHA
; Q- G- V# j3 S TXA
- ~  k2 @0 |2 Z+ f1 r2 w PHA
) S, {, A2 M. ]! M( x TYA) H, A* j6 N9 z# T) c  s
PHA
$ R9 J9 L. c& t LDA ADDR_DATA_TO" i( n) q3 g& Y6 t! L0 P7 ~
PHA" G5 F  i! b" h, {. p
LDA ADDR_DATA_TO+1
) b% n7 M/ M) ~( o; [+ b' M0 v PHA
9 R4 r% H/ V/ b LDA ADDR_FROM_START
! V- w8 i1 }' X9 v" S PHA
( [. F3 I; W- `' `  q! l LDA ADDR_FROM_START+19 w5 j3 J( K; p$ L
PHA
4 k- s$ b' y4 B+ M LDA ADDR_FROM_END
" d. c5 b( [9 z" z% S! ] PHA0 t9 h+ Y" `  w7 j! ~- v4 G0 _
LDA ADDR_FROM_END+1
# r$ J5 _2 U( f0 i- V PHA9 B- J+ d% r, ~- l8 x8 |! w! P

, ]7 X! h4 J6 i; B; iOFF_INT:   ;屏蔽中断3 s3 X  n3 j& X+ c& I
LDA INT_ADDR
7 Q- i0 _) R% j4 u. c AND #$7F
6 u1 j7 p& P' }! l2 W1 B. _ STA $2000    ;屏蔽中断0 ~9 T' ~6 {1 a1 a

# o+ y5 s7 H5 v, [1 x# V0 E ) d$ O9 W1 H& N% o( J" Q& a& [" _
SET_DATA_ADDR_START:    ;设置复制起始地址
% q# ]( q/ L( J5 w* a LDA ADDR_BEGIN$ T7 w  F8 Y5 H5 z
STA ADDR_FROM_START    ;设置复制起始地址低位
0 L* i" V0 g, C: z3 }2 \ LDA ADDR_BEGIN+1: d3 {8 I0 l  e; H! @7 k6 j0 J! s
STA ADDR_FROM_START+1    ;设置复制起始地址高位8 e/ i5 r  q6 c/ n% n: E

* N: X( H/ E  s+ c4 aSET_DATA_ADDR_END:    ;设置复制结束地址) \, Z' r, L* o" x" R4 h
LDA ADDR_END3 l' a+ G; c1 f
STA ADDR_FROM_END    ;设置复制结束地址低位
5 I4 f  F9 U5 e  Y* z+ @0 {! [ LDA ADDR_END+1$ P9 Q$ a/ Q4 B, M9 G9 x) `7 U
STA ADDR_FROM_END+1    ;设置复制结束地址高位8 _. P3 j! L7 y0 l
' ~  r) ?* e& Q: z8 D" u
SET_DATA_COPY_START:   ;设置目的起始地址7 m" x2 V) G( u/ O( y& W' Z
LDA ADDR_TO0 _$ E9 ?6 K) a0 Z. z+ n* b8 y
STA ADDR_DATA_TO   ;设置目的起始地址低位5 {- e4 x1 w) `
LDA ADDR_TO+18 J0 w3 t  A' h) Z
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
# R. E) j. I# S( B9 Y! ~" }
; L- ?) {0 o5 s) U. |% ]OVER_COPY_CMP:    ;复制完成比较
# W" {1 N, f' j( a$ r3 l" H LDA FLAG_OVER6 y$ ], L+ z, R8 m
CMP #$FE    ;复制完成标志比较
; O$ w5 @& I" Y) l+ R  { BEQ DATA_COPY_EXACT
' J* ]. M$ m- N% u% ]5 _) j; q5 @3 G* m& D. s8 J, w4 s
INI_XY_COUNT:   ;计数器初始化
: n- o& y3 k  |+ Y/ P LDX #$00
& |' @7 E. V4 K1 n. z# m5 x" Q LDY #$00* W$ u+ F& |! ^/ r0 N7 T- J

! B/ Y& J2 F, w1 xCOPY_OVER_CMP:    ;地址比较
7 o# a) ]3 a- g' V- ]: |: k LDA ADDR_FROM_START5 a) ^" \4 c  c2 s. X# w
CMP ADDR_FROM_END0 S0 m; E7 u+ ^: ?1 a
BNE COPY_START- K4 c! c9 W" l
LDA ADDR_FROM_START+1
4 k& y5 o* P0 @3 r6 h8 ? CMP ADDR_FROM_END+1; M! r' ]3 ^$ F* T+ C8 H
BEQ COPY_OVER
# U* y4 p# l0 a" U' J/ G; l
: l( d, D, b( J: A7 A8 o5 z1 b% pCOPY_START:    ;数据复制开始& E! H' p5 Y6 T! O! ?; ^5 H
LDA (ADDR_FROM_START),Y    ;读取源地址) e( |* D! a& W, U
STA (ADDR_DATA_TO),Y    ;写入目的地址
) H/ k- d) N2 i6 C( o INC ADDR_FROM_START   ;源地址低位递增* f" W& K( f  b) V! W
INC ADDR_DATA_TO   ;目的地址低位递增
* o% r4 ?6 B* A1 A' r: M BNE COPY_JMP
# _2 W! v+ n: q+ f/ Y- z INC ADDR_FROM_START+1   ;源地址高位递增1 W. M1 j5 X: z# x
INC ADDR_DATA_TO+1   ;目的地址高位递增
4 G9 o; v2 B: W# s  Q , d. p3 \/ C4 Q5 i1 X& c
COPY_JMP:    6 \" N0 U0 f6 v& y( l) z  [2 \
JMP COPY_OVER_CMP
; q  H& e1 b8 A$ q3 x, A! i+ X3 n% a$ q. y9 K
COPY_OVER:    ;复制完成
8 F. @: v& U8 [, H9 ] LDA #$FE) g% v; m4 ?' w: Q+ _8 m
STA FLAG_OVER    ;写入完成标志
$ M4 R: D3 }+ W" O) H2 QFINAL_BYTE:
# T9 Z7 L& a) H& h7 v LDA (ADDR_FROM_START),Y    ;读取最后一个字节, K& D2 W9 V9 w% ]9 P
STA (ADDR_DATA_TO),Y    ;写入最后一个字节4 S# y6 J$ A6 D0 V1 K% K
+ C. ~3 _  x; W* \
DATA_COPY_EXACT:    ;恢复数据1 v7 D; D, @7 D, V
LDA INT_ADDR
, R: K( Q( _$ F* {+ }4 M! F: h STA $2000    ;恢复中断3 G) K2 r  i) @1 k1 _' G! J! S
PLA
5 S+ y, B+ }( j/ c" f* ? STA ADDR_FROM_END+1- f6 o# H. b6 F0 s2 i! ]: F7 s
PLA9 E4 c& X1 U8 y
STA ADDR_FROM_END
' ~! X% w, T. T" h* i PLA
3 F# b4 d# b8 x7 I STA ADDR_FROM_START+13 y: {$ U; j7 W1 C
PLA
4 J5 `* X. @# K4 f9 N6 [5 ?! b STA ADDR_FROM_START, A# w3 M- U* }. @) ^! T
PLA% V" j; f6 [, E) k( ]0 Z5 S! i$ ?
STA ADDR_DATA_TO+1- c9 y  z  q) J% ]( s2 t
PLA3 d, m; B' Y' @
STA ADDR_DATA_TO
. f4 c) ^0 h! @7 z8 `0 t PLA2 E( S9 E2 N, l, }2 {
TAY: `* i6 ?* t& x
PLA- F- s7 |& @& f# x3 [
TAX& x; e/ [: z0 j: D; t7 l% S0 ^
PLA
& G; O) T0 ]+ I. p5 f PLP
. N8 g9 ?" ]4 e( R0 i
" c: ^6 `$ u4 z % K& ^; D- l3 A: i( t+ ?6 D
/ z; N3 H5 w* N: d4 F# d9 C
DATA_COPY_RETURN:
: j) z" w4 S1 r' y: Q' g RTS
/ n  K/ _( s. ~+ `- P( P% G
2 v. b8 T! c, Z- s .ORG $C056    ;精灵指令覆盖$ M# k$ u0 l' U  I6 X7 S( a
JSR $FFB5
# f& n* b8 u  B3 c1 h% W
1 F. _; R$ j/ s. W/ S; ?2 ~ .ORG $FFB5    ;. Y4 Z* ^. D3 u9 m3 V
PHA5 Z. L1 |- J! U2 }
  TXA1 E: [# m5 ?% b* p+ ?  k, u
PHA
8 v: _: T7 y2 x5 s TYA
! g5 [0 x: I( l/ y6 v$ H& S PHA
5 X8 W4 ^4 w( S! D9 V& A+ T LDA $71FF    ;比较7000-71FE数据是否完成复制2 U  h. B7 S  b/ t
CMP #$FE
$ k) _! {9 e$ c& ]) q2 M BNE ADDR_FFCA
8 {7 i. q" x( ?- a PLA% c5 M5 e! Q, c% t$ O) h3 K% o4 y
TAY
; n+ F6 @& e+ E) _* K* z3 q PLA
& E9 u% ?& `' [/ D! W2 n& t" b TAX
& z  w( J5 l' g& p" w PLA
- B4 z# s. U# B9 W/ J3 M8 q! ?6 Q JSR $7000   ;跳转到自写程序
* c0 ^# [% B8 r. R6 M1 @ RTS( k( Y! N( Z7 c* _  h
ADDR_FFCA:
. l0 y6 X' b( Z9 Q$ o* t7 \1 \ PLA
1 g0 c, L8 ^2 T. ] TAY
& J1 Y) G7 R  r7 l. U, | PLA2 W3 [3 e1 R) E) o5 S. b
TAX) ?" V9 ^$ G$ |1 |$ q8 z9 M9 ?& E
PLA
: O  r1 O9 |" M: o. F* d RTS4 [# r1 s3 f# g! _

" s2 U. E% O. }" S' N
1 B, b% {' [8 m9 ]# W& E3 g
" Y# l, |& g8 M$ ^ .ORG $C264    ;自定义的MAPPER2切页程序
6 d9 g7 P/ z" ^8 b: a1 b' n0 ^ PHA
* X0 [7 a5 j! v  c* H+ ]- ]; o9 d TXA8 A# `- c# v/ m1 d* h# W
PHA
/ t" M% F6 j- C/ e' ~5 @# o+ Y LDA $00668 {5 E/ V" ]% o5 M' }/ S& `
BNE ADDRC280! c1 ?3 g6 m8 L) w7 w
LDA #$07) b$ I5 Q# z, `( _/ D! g( e
LDX #$031 w5 v, J. Q9 Q2 V+ M. T3 C
JSR $CD9B    ;自带的切bank方法
; Z9 ], o5 z4 I! r PLA6 s. {5 y7 ~* p5 s0 `) J
TAX
" f9 R7 K4 O( f; A4 x PLA- Q6 _+ {" J3 Y
JSR $8000# W2 W6 e, Q" ^
LDA #$06
4 Q5 _& Q9 G( M0 g6 X LDX #$03
! X& X, f+ ~2 V2 B( M. a JSR $CD9B    ;切回原该切得bank(可以不用)
7 R' c* ~% l' m) D RTS/ N) l0 G4 k9 B% c2 Q' H6 v2 U
ADDRC280:
9 ^9 o, C9 v/ t8 n- B0 [ PLA
: y1 Y) y( l; c3 x, X5 H TAX: h9 n* P9 B9 `' g* Q
PLA
2 o5 Z' `; w' [; c/ Z& s RTS& n+ O" \: |3 R4 j: |9 D

& ?9 q$ `! ]( x+ h3 N' P ) n" ~/ G5 ^; U8 `, ]' v
;[FC][最终任务PPU][END]8 e$ L' t& R, t" @7 h
.ORG $C056    ;跳转到PPU重写程序- v) L5 ^; V) B. x% c: D4 z% q* o
JSR $7000' Z: \8 ?( W/ r6 X% A
* \- H. g. }6 ]
.ORG $CEBF, N' G  m% d3 X2 }+ @% t  V1 K) j
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
" C9 e0 L. [' H% G) y8 _, @  6 D: \4 P9 }. ]+ {
  .ORG $E4604 G% @1 ^+ O4 M! [
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入$ O6 e( y' [* k" k- C  i
  # [" j, [5 F) R, E- w
.ORG $71F0+ @% j- w, R/ ^' `- ]4 o) E
STAGE_DATA_WRITE:
% w) h" W5 V* u6 ]! I3 f/ x  LDA $60109 _6 I* i# Y. x$ ^
  STA $1E    ;关卡写入
  k& s8 k+ i. e  LDA #$006 N+ p( U$ `* K0 M1 N3 Q
  RTS
+ E8 p4 e$ \- Z# K" v .ORG $71C0
1 K8 D; `* T/ B4 [BULLET_DATA_WRITE:    ;副武器数据写入
5 P4 _$ G# r2 W CPX #$0E
, k4 F. y$ u: Q4 D, M1 P BCS P2_BUL
; M0 }5 Y* W, E- }P1_BUL:, l- l# w0 }9 k( r" l8 t( u
LDA $6004# Q- h! \) G* d( c7 a7 Q
JSR $D7D0    ;P1副武器数据写入
0 a7 X- x' S; O0 n, i8 | RTS
% t% R& C( `4 M  X1 `3 rP2_BUL:
* T, G9 \) D  G, N4 A LDA $6005: b$ R) y2 H$ L- t# t
JSR $D7D0    ;P2副武器数据写入
; r; q1 ^; N' b' I, ^1 L RTS4 M6 ?  r$ G6 _8 {
3 @, K0 C+ D5 o+ D
6 R6 ?" h2 ]2 e) C
.ORG $7000
6 s( _: I/ d, M  
$ T4 n, t3 u/ E+ n* N( Z STY $4014    ;补上覆盖的精灵写入指令
# n  C/ Y9 F, ~! t( J1 k2 {. a' D PHA
7 Z0 E+ Q/ T* j% C. ^% [ TXA
% y1 Q8 `6 k4 T9 E PHA
# T* P* u9 {. R9 Y2 _ TYA
# E6 I3 G: M- ?. r+ ~( E4 h PHA: ?, p. u5 a( s1 z
LDA $0C8 J/ ^0 B% o( ~6 q2 _+ w: f$ F% Y; E
CMP #$01    ;比较是否为标题画面( }. G. O6 ?9 P; q7 y
BEQ PPU_STAGE
, E" G% I# l$ t5 D# b PLA! X5 n6 v. e  b6 y$ R
TAY8 q! a" n9 R9 h9 s( T. P- F8 h$ f
PLA7 K2 e. P# |# |: Y. j
TAX
8 b! U0 Q* J; s; \8 N PLA
4 A. W# Q7 ~$ G2 p: a) V9 } RTS% @. z) v, v( t6 ]" h( i9 h
PPU_STAGE:    ;STAGE显示程序# [9 e( }+ Z5 ~
LDA PPU_ADDR_DATA
3 y$ g$ Z' D& F+ Q9 S0 u7 [: D" z: g STA $2006
9 u6 Z/ y" ]6 }5 n/ d0 d LDA PPU_ADDR_DATA+1
( t) R; p" r1 d. Z- T9 F) v9 ] STA $2006    ;坐标设置
7 D; G" u7 l2 p7 q6 X LDX #$00" W4 z* M/ P* |
PPU_STAGE_WROTE:    ;写入STAGE字模
% N5 T, I1 g* ~8 ?, ~ LDA STAGE_DATA,X
( C0 B  a! s1 q* V, Z! E, J STA $2007
: p7 j' M! R; n4 Z INX
8 A  p- z( E2 J CPX #$06% f" L  P  i  v; K+ \5 t6 _# }; Z
BCC PPU_STAGE_WROTE
$ h6 ]6 U1 [5 b0 K$ z LDA $6010
: s" u/ U- a- }: n CMP #$FF    ;关卡数据初始化条件判断/ F/ V* Z! y# b( k
BNE KEY_B
, y  U) b& O  V) j! Z; t5 ~7 m, l LDA #$00) j. o* D! ?1 j8 g( S# E$ i
STA $6010    ;关卡数据初始化
! v% {- V  g4 F" uKEY_B:    ;关卡减少  y* o8 |# ?8 C! M+ A
LDA $04
: h9 e1 }) D- O% } AND #$42    ;按键B或左减关
' {. h, ^8 x, m4 K4 ^ BEQ KEY_A; s5 j4 Q3 l8 D4 q  a; @' Z$ b' X' V
LDA $6010
, {3 G  g# ?2 g CMP #$00    ;关卡比较
/ N* J8 z8 l) X9 d BEQ KEY_A
% j3 e! U$ y/ x DEC $6010   ;减关6 s( V8 N6 q7 }
KEY_A:    ;关卡增加  F6 L: l0 U. }9 T! V
LDA $04: U- A0 B' w& d' n' r1 L$ k1 a
AND #$81    ;按键A或右加关# y  U1 X) c) @8 E/ {/ Q' Z* d
BEQ PPU_NUM_WRITE" {) x! p' z/ P
LDA $6010( J1 A# L% d9 \' I0 U% S
CMP #$04    ;关卡比较
% I- v) @& z% g+ ?8 Y* R; A# v BEQ PPU_NUM_WRITE
) |7 K7 x- Z4 M. [' [' c INC $6010    ;加关& X4 b4 }: w/ f1 L' a, e
PPU_NUM_WRITE:
; X- I# `" v% J, }' ]; `9 B LDA $6010- Q  R4 h' }8 y. t
TAX
6 f& j( R. x7 ]( D* _ LDA STAGE_NUM,X    ;写入数字& K& R) ?; J2 k7 w+ S7 E" [
STA $2007
% ^  u; N! c# c8 o, T0 G/ SPPU_RTS:
! w  j6 w" l. [8 W& A PLA) h: t" e) C2 \( `" e& s
TAY
- ]4 c3 @8 u0 ?# X) | PLA
0 x6 Q! F, l' D TAX4 q- c- n# k; Y
PLA6 S" c! e* {8 V  S0 Y% Q
RTS9 Z3 E& k0 S) F7 K' T
! O! n3 S7 q1 v& K
' M1 @1 J) T1 C" e: Z
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据4 |+ u  r9 K7 |% B" E. C1 M
.BYTE $EC,$ED,$DA,$E0,$DE,00
; |6 o! T# l+ G8 J( @6 A+ WSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据* T4 j, F' W+ V
.BYTE $D1,$D2,$D3,$D4,$D5: ?* s3 z0 f& Z  c" C1 P
7 r- S5 @4 R# {
PPU_ADDR_DATA:
! g2 y8 V  s7 Z+ }! |1 u .BYTE $23,$0C
7 c% a1 H7 y! c8 R% ?1 _4 l " ^7 O# J! t$ l/ ?0 g

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

签到天数: 179 天

[LV.7]常住居民III

发表于 2017-4-1 14:04:39 | 显示全部楼层
旋风又在发布高深游戏文化了 呵呵呵 顶顶顶
[发帖际遇]: 九月鹰飞辛苦发帖,赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2025-2-19 06:36 , Processed in 1.078125 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表