EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
3 Z& X6 K- P, c  K0 E6 G/ t2 X2 A/ Y! _2 J- l
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.& B% O& R+ g6 F2 M
然而,今天想到一个思路.; q* @# s" p  m9 Q8 Z+ K
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
1 x% |/ }& Y& a% y- Q* M2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE$ M: [! l; v# e
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).$ }( P) ~3 l, R6 N: H( P

$ Y' D+ t9 v# X
" ?+ k4 Q  X- i, z5 w;[FC][最终任务KEY][END]& v" L* I1 @: c: O" w% w0 _3 @
button = $04    ;单次按键
& [5 D5 f# u. L8 iflag = $6000    ;功能开关标志9 E+ G7 K9 o( s5 j
pause = $000E   ;暂停地址1 N; d( H, U* n! b- r  p+ Q0 A
& T- t+ l+ A3 G- }  V1 G0 r2 w
.ORG $8000* E! a; o" |* w" Q% T, c$ a% F
LDY #$08    ;自带的按键程序
3 p! a( V4 `0 G$ R$ gADDR8002:
* W# ~" u. W1 J, D. N LDA $4016,X
) M. i; Y" U$ L LSR! P2 i0 |, Y( p
ROL $0021
" H! w( w& l) A; d$ k LSR
1 _( K9 m( {; i ROL $0029
4 W/ v* }2 ]5 l( k0 o1 d8 ` DEY* z) X2 W& G5 W# I
BNE $8002
% ?, l! s9 i# m# l# @ LDA $0021, \: |0 c% ?" B: y% W& r
ORA $0029$ @3 u5 m3 b6 [% `
STA $0021  n( e+ ^) V! J' \4 J  W0 x
LDA $0020
+ y7 g% H+ d4 a  Q) d) G AND $0021
" U; x  z5 b8 v; _- N& \ STA $0020
0 V3 `- \; |% I' } LDA $06,X! \. _% ?$ k0 N4 m
EOR $00209 D* o0 P! b" @# F. q( ^. p
AND $0020/ |# ~5 E; Z* Y# P' Q9 E7 H
STA $04,X
3 K( z* a+ O4 G LDA $0020
( E! t, ^% Q6 f9 x4 L, m5 D STA $06,X
) `5 ^3 d. V; X- J JSR KEY_OPERATE
- v  V: \' h$ L( M, W! t JSR Function    ;功能调用
/ F9 K9 I1 G) _: t! ~" a" A JSR Weapon    ;武器切换调用
5 M7 Q% {7 j3 o: P( @1 c, X8 ]+ x JSR Power    ;威力调用
% u  W. U* J/ M" x$ W JSR BULLET_NUM    ;子弹数目
- l: ?$ v: s4 N0 u2 b JSR BULLET    ;副武器类型7 X6 B* s/ o* K
RTS
3 N) K9 U! ^4 S% w$ F3 j
; M- C! A5 p6 \. b3 x
) _5 S4 O& r- q! U4 \$ F. N  M/ j- l3 r& Q! v( o1 D
.ORG $8050
5 ~8 i4 ]9 w  ^5 K4 }Function:    ;功能- K8 n+ r) l6 J8 b0 n7 P
WUDI:    ;无敌2 e8 I6 C- T% D
LDA $6000,X
, T& d9 I0 Z- C3 h) x  a AND #$08    ;开关判断
1 e7 ]& {: I: l/ J BEQ LIFE
9 d6 d6 r' W& s' U& P1 V LDA #$05
3 ~5 I! G4 `/ I2 l) ^ STA $05DC,X    ;无敌锁定
- |. c5 A$ E* _- q) n: L$ ?LIFE:    ;生命
9 Y& V, d1 i: y% h, C LDA $6000,X
( k5 ^, y% |  ~ AND #$04    ;开关判断
  W! m6 I# q7 w( _# u, y BEQ FUNRTS
  N! ]/ F' T$ s' P  e' Z7 d LDA #$05" Y3 a9 s: H& f5 u" K6 b" l9 q
STA $1C,X    ;生命赋值
( K% C5 D6 A  N. I7 Y& f* RFUNRTS:
; B# g' S7 t+ T2 ` RTS
8 x! S' H9 z8 Z" V $ z% i2 z' a: ?
Weapon:    ;武器切换
$ n/ Q( a7 g$ R+ M9 C LDA pause    ;暂停状态判断3 S" j+ `) M# F
BNE WEARTS( h9 V/ L) m0 z
LDA $04,X: W) G8 I: P' V* U2 x
CMP #$20    ;选择键判断
- z6 H+ ~1 {% P) G1 t% d# q$ `( F* r BNE WEARTS
/ g: V5 I# b8 A# M LDA $12,X0 Q6 Q! u- V3 Z' x+ g
CMP #$03    ;武器值判断
7 k& L  f* _# s6 w; p2 p BCC WEAINC
3 q# R; O  D6 a. N1 r. R LDA #$FF" r- T9 R- j+ l/ a8 m# h
STA $12,X    ;武器重置
# b) y" h) o- l- J* r1 V: fWEAINC:/ R/ X0 |2 \: L0 ?
INC $12,X    ;武器增加: K& g" |) \: r7 Z

1 z: M3 l; O2 }* N1 vWEARTS:
9 f) P2 x  u) ^7 G RTS3 w3 A" g3 u8 Z* B) `

; Y0 k) g7 {7 Y4 ]+ k  y7 C4 wPower:    ;威力
, c4 t5 f7 q7 m% Z1 Q$ a LDA pause    ;暂停状态判断
# H5 ^6 F: K( |" B5 f0 n BEQ SPERTS
; x7 J9 \+ ~' e: RBUT_LEFT:- H( p7 s0 a5 m1 f4 }
LDA $04,X- i6 j3 u9 |; x8 y/ A4 _
CMP #$02    ;左按键判断
3 v7 E/ Z3 {2 P BNE BUT_RIGHT1 {/ o9 A0 P# j, g
LDA $88,X
$ w) ?( n+ ~) m, d0 Z# N% {2 m% w CMP #$00    ;威力判断
+ V9 ^2 [0 z" Y7 K BEQ SPERTS  d; z/ V2 u6 Q% t; ^5 i7 ^* V. G& {& N) L
SPEDEC
9 H) w9 P/ D9 ^0 n) k" m LDA $88,X    ;读取武器值
5 ]0 _1 K' f" p SEC# V5 x# L) {0 J+ {. w+ T
SBC #$08
" u( h: E3 I2 l STA $88,X    ;威力减小
6 I/ @- W' k8 P' G) L+ [4 x: ZBUT_RIGHT:
  l! I* A8 i4 T LDA $04,X" x& z) k+ ]0 J( d
CMP #$01    ;右按键判断
" T7 f. G8 P. P/ ]8 m BNE SPERTS6 y6 ?. g( r# G
LDA $88,X
0 j% a. F. w2 e+ i7 }. D, B; T! Z CMP #$10    ;威力判断
& |- M8 [# P9 X BEQ SPERTS
( [0 F7 Q- }5 g- ~! w; O" Y9 z2 ^3 d1 wSPEINC:
2 h  T0 t6 ~" f) X! D; }) l LDA $88,X    ;读取武器值1 b- y) W* I0 G" b
CLC
9 l( `! z: W- w: ^% \) C3 a ADC #$08
6 t$ {2 B' o* X3 o8 ^ STA $88,X    ;威力增大' A2 M4 \6 B% W" e! b3 |8 k  M5 e
( C1 L% Z' H) J% O) U7 H. i
SPERTS:
5 H7 Z) u$ ^3 R; c- S RTS
3 Z7 J: S2 j6 F9 ^% \- A5 B% O. v. a7 h4 ~0 N: D/ t
BULLET_NUM:    ;子弹数目
+ n+ D2 t$ K1 l0 e/ X4 F0 X3 \ LDA pause    ;暂停状态判断/ P8 A7 }/ [1 V& z" ~
BEQ BULRTS8 u5 k' I6 ^: r* L- b7 [
CPX #$00    ;主机玩家判断
4 Y: ?& l( a! ^' M* d BNE BULRTS% B0 X% A9 f1 {# Y, T& F
LDA $04,X    ;主机玩家判断
5 h. f; \9 W7 e AND #$80    ;按键A比较
8 ?& D7 w% e) x: P BEQ BULRTS
% d/ V+ ]+ @5 i; q4 T7 F: ~9 w1 C/ M LDA $87    ;状态判断
; f9 [) d+ b- ] BEQ BUL_2
: L( K* {% V1 z$ i7 w' G, i- s5 G9 rBUL_1:
- T: G  s1 o* T; e8 W; o LDA #$00
+ H* f' M% ~( w8 U& G% F STA $87    ;1发子弹2 ^. g: {: o! Y+ B
BEQ BULRTS
$ A$ x" X9 t* z9 C5 _& C4 C# OBUL_2:
4 p* |1 M7 F0 y1 y7 Q LDA #$01
; [3 V0 _+ S" a1 r  ~# | STA $87    ;2发子弹
! e! r9 _, h6 j' A; P. n
- `# s4 F1 p, E6 Q1 l; M# g1 TBULRTS:% c* g) q6 n- D; o: @2 h  {
RTS
( {) l/ k1 s+ U+ i3 r : q' O* T5 _9 z3 p5 I" c( k' [2 m

1 J. S3 W3 h; u& M# `5 u3 gBULLET:
  D) `. u' h3 r7 v4 n# s LDA pause    ;判断暂停状态
; y; m) l; B, L3 x& A+ W6 t BEQ BULLETRTS
9 k3 s2 \: `* y LDA $04,X
! P7 o" D: k7 U) P) | CMP #$40    ;按键B比较- s' r. t" V* A( V
BNE BULLETRTS
+ X+ R/ {( r9 b LDA $6002,X    ;读取副武器4 l1 ~9 W/ @* R2 S
CMP #$03
% F5 T/ z, H* P BCC BULLETADD* F. z# _6 O4 B' J
LDA #$FF7 K/ Q, Q* v2 x* _5 z& {, d1 m
STA $6002,X
$ U7 `* [5 n9 z& _BULLETADD:; g# u! t$ ]9 {$ n# X# [: K1 q# `
INC $6002,X" t- w( v5 D. e6 D9 l

4 j7 C  n. _3 O( K/ m9 A. LBULLETRTS:% |0 H5 g% a& c; G
LDA $6002,X, G0 p3 l7 U, E+ s5 \, M* m. J
TAY
) Q, P# h0 X) g7 k LDA BULLET_DATA,Y
5 Y0 e% ^/ v: N( \2 _; H' {# K1 {8 ]. _ STA $6004,X    ;写入副武器数据/ i% M% h7 v6 N' v4 R& V
RTS$ C: a: T1 q; f, w9 j

/ N- {/ `5 r3 g: k) ~; d! L
+ [  n% N% [% O5 i0 G: m2 A% {BULLET_DATA:
% Y6 \2 _0 I, w$ s, W+ q# ~ .BYTE $06,$02,$03,$04* q  h7 A1 n% W8 j
8 b, l) i$ t# A' Z& g( Z

0 n* Y  }; f0 R* y# G5 K
# {* g" U. }% w1 ?) f' ^( nKEY_OPERATE:    ;按键开关操作
  W/ C' }6 `3 Z7 Z8 x% }: vdata_protect:    ;数据保护$ s7 g; H4 Z! q. a1 J! a: R2 r& u
PHA* ^. S2 \, D' `. h( w' z4 x
TXA
+ m3 O* O% q  z9 u PHA
6 `; M. n/ g  C4 [" x% u TYA8 F) k" a) U9 k2 u3 X' q
PHA
9 `" k0 e) e9 a! y- c9 [4 L# M3 ^; C
4 D+ j) e9 T- n) M, lFLAG_INI:    ;开关标志初始化
! c* Y# l! _- L1 k( y  E: @) n
2 e  k' R5 }4 K7 ]4 A8 d# L* q3 _; l LDA $600F
+ C3 i; S: C1 }& j( m8 J CMP #$016 ~2 m2 X( `4 M/ {2 f3 \% f* c7 a
BEQ pause_cmp5 \9 Z) L$ k3 z" Z
LDA #$00
2 b# j6 [2 m7 {4 J2 q STA $6000/ @: N, @) w- M3 t+ ?7 ?: G
STA $6001
9 H4 S+ s+ T6 X, V5 w  ]& G STA $6002* H- c! q( i: C1 t# w# o0 E
STA $6003
% G" P' s# B# y* Y& g% w STA $60041 ~+ `* r% Z& p& t: |7 w) R
STA $6005
: Q/ U& d+ T2 E3 a. n) W LDA #$01$ D. O  U% U5 S* s
STA $600F
% s( S: L% J/ e4 S2 h' H( s 6 c1 ^- K4 L3 B8 u& F. k+ y5 b' M2 c
pause_cmp:    ;判断暂停状态
" I& @3 f$ G- |; F, [& N! X LDA pause! r+ W! D! z6 P) Z+ P& e0 i
CMP #$01    ;判断暂停状态
! i5 A# w% Q$ ]1 U BEQ button_press7 z: g4 }9 |1 x- J- U* a0 Q! g
PLA3 G0 V6 ?( }! W2 R7 Y3 ]
TAY
$ X/ ~1 ]. o7 C( X: {& U PLA7 I! q" t9 p0 [
TAX# ?4 i7 Z2 n( A! |
PLA
! h8 q1 b2 `' ]% G RTS) c4 W, s1 L# x( s( A% G
9 |( U4 j5 ^; @, U! Y- ?
button_press:    ;按压操作
( p9 B4 i: Q1 O8 x+ O# e" E, ?ini_Y:) x* D/ a1 \5 m0 o
LDY #$00( [8 l! l  T0 F3 A6 @% r
button_cmp:; L+ s0 q! S# @+ z5 N6 l
LDA button,X6 I7 _5 m; F  }6 f! {
CMP ora_data,Y
# Q' T+ R. U& D BNE count_Y_cmp
6 V5 c% d  J( T  z% ^flag_cmp:4 K9 B6 D4 d8 t/ p! Z4 F+ z7 M
LDA flag,X
6 ^0 k8 U/ B. E. _. ?. i AND ora_data,Y. g$ S: k; [5 u( b. y3 h. ^: T4 q1 A
BNE flag_and8 v2 \/ Z9 Q8 [/ p
flag_ora:
5 ?% N7 d/ H. u. d) S) u& ~" [ LDA flag,X
7 L, `6 |0 N* k. w# B3 S ORA ora_data,Y# q( n2 b4 o# j. a$ w! {
STA flag,X& _) A2 k8 Z$ F" x( w
BNE count_Y_cmp
2 W& n  N/ v& X- h! G1 T3 `, P& sflag_and:9 }" |% E) l" W8 Y$ w
LDA flag,X% F8 |+ n& }" r5 z
AND and_data,Y
" U3 J: ?2 ?% W# U STA flag,X
, ]" E& q/ H9 ?count_Y_cmp:
# }5 P% m: ~0 k- {# o1 f* Z/ g INY% ]; M% D& B& h! Z' n6 V3 c! V3 M
CPY #$08
% d1 |# X% `9 i4 J2 U! W BCC button_cmp
. j, l' l+ d3 j. ]8 X 2 o; B& U1 L+ S7 {; ?/ p0 c1 y! P
data_extract:    ;数据恢复  L7 K: ]8 `5 e$ y
PLA
9 U( d3 y9 X& \5 j TAY, ^' T; J1 D2 c  p6 z  ^- F
PLA
/ b; t! d) O3 W TAX7 b8 p7 {# M4 ^4 W
PLA
0 W/ C# N) d, T2 T( H1 u2 f 9 @) h# x- R+ V9 o6 R+ [8 ^
return:
& ?: _$ i+ l4 k+ U3 z RTS: H" M$ L. L' W3 d; c6 z1 _

4 ?: I* X! h9 S# D2 |ora_data:   ;按键相或数据9 h5 a: B$ w" |: `7 \1 J7 \$ h: _! G( h' R
.BYTE $08,$04,$02,$01,$80,$40,$20,$106 q, D( W* ^& q5 G
and_data:   ;按键相与数据2 Q4 m( W% c. n7 U% a1 @
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
& r4 ~* T" S; c # C" g3 t! ?/ g3 U7 k4 ?/ w  d+ F

- L% o0 W% M+ S' g+ i # F( R( U; ^# E! E- A- [
;FC数据搬移程序 BY FlameCyclone0 m/ t9 N  ~$ U/ q% z# a" j
.ORG $8200
$ Q' y( J3 w% f  {. w2 _; ]; | JMP DATA_COPY_PROTECT8 V- m, a  z% [: b/ W6 B8 a
- ]1 _. C8 k* H" D3 w
ADDR_DATA_TO = $40    ;目的地址
/ y8 T7 I6 o, O- [, M! n( MADDR_FROM_START = $42    ;源开始地址
4 a+ ^+ ^4 B( a6 Q, EADDR_FROM_END = $44    ;源结束地址
$ N% U' N5 v! t& L5 i: @$ k' Y: Z, f  K' o& I
ADDR_TO:    ;目的地址+ |: n9 _& g& v8 U
.BYTE $00,$70
# z6 N6 W. u8 U. PADDR_BEGIN:    ;源开始地址* h4 N' n* c4 O0 O8 }
.BYTE $00,$83" r5 y4 n; {5 U1 ~# B! Y: f/ h2 h$ \
ADDR_END:    ;源结束地址  P9 c' ~  U/ P; p1 s$ X
.BYTE $FE,$84& j8 r+ N; X8 ^  L

  a/ p' p+ ]+ T) K+ vINT_ADDR = $08    ;中断地址
' X  p0 A/ S) v/ m6 r" XFLAG_OVER = $71FF    ;完成标志! C7 v% E/ U4 }$ J/ _: M5 p
1 Y3 T- t0 J! G; D$ m6 E

% k5 s4 o, n+ B* i5 {5 B7 _4 \: D, JDATA_COPY_PROTECT:    ;保护数据
4 I. m/ w; W% V- ]- | PHP: u# N, w0 N+ u7 w
PHA
4 C: i- T; R. T/ o TXA
7 E  I" U/ s# d9 F% [ PHA8 Z. X# f/ m  w  X  y$ o) a# n7 N
TYA( o( C  Y4 q% {9 w
PHA" ~0 V5 }7 g& E4 o- w: n
LDA ADDR_DATA_TO
7 @6 l. ]" \; ? PHA7 e8 h  p' E- g- x9 f' q  v) o/ \
LDA ADDR_DATA_TO+1
' E4 R; t  T! X4 E1 W+ N PHA& B+ g) O4 l0 g9 Q8 K% ?( u3 C
LDA ADDR_FROM_START
# ?7 U) n2 U' T/ x  s PHA9 K8 Q0 D: e# z# v
LDA ADDR_FROM_START+1
% G, g# S6 Z6 |- E0 J8 p PHA
" {/ F2 g! k  @3 W0 l; C# { LDA ADDR_FROM_END
7 ], W, r9 E8 ^ PHA# O$ a0 \% ^( Y& f3 S, P& l
LDA ADDR_FROM_END+16 E" J7 {$ ?6 p/ F" _3 w) g8 D
PHA; X8 T2 s2 B$ J* z, @; n0 S

; g- U: X! r% E5 M/ G; I* xOFF_INT:   ;屏蔽中断
# e( v& e* I3 V+ s LDA INT_ADDR
  E. k& z' z- ]$ a AND #$7F
( l5 G0 r  Y8 J* M+ k0 P8 U) y3 I STA $2000    ;屏蔽中断
. C& A. a9 R6 d7 z
+ L- a- L& F. {' M1 H& I, | ' h2 O$ ^% y. f7 _* R
SET_DATA_ADDR_START:    ;设置复制起始地址% _4 C* @3 K* o3 Y! S6 `9 t
LDA ADDR_BEGIN0 n, d1 K- O: Q4 B9 c% U
STA ADDR_FROM_START    ;设置复制起始地址低位
3 T' s8 W' t  \ LDA ADDR_BEGIN+1$ x# F+ x. E6 _1 y( ^9 z0 w
STA ADDR_FROM_START+1    ;设置复制起始地址高位
3 m2 E+ b0 q  K& H" q- E
/ e. ^  Y, @; P& n* ASET_DATA_ADDR_END:    ;设置复制结束地址) C  p+ N+ m2 x. |. m& @7 ]/ y% I- p
LDA ADDR_END
/ o0 v/ |* t2 {4 x STA ADDR_FROM_END    ;设置复制结束地址低位: e! K- l+ ~& e2 q9 A
LDA ADDR_END+1
) D" \6 I; v0 A% P$ C7 G8 `3 R2 D6 j STA ADDR_FROM_END+1    ;设置复制结束地址高位
$ B. ~4 w" r$ H, a7 L. g
' n- H9 t9 m! B" A! v* N9 X2 ]2 Q. NSET_DATA_COPY_START:   ;设置目的起始地址; ~( q  `$ U3 L+ P7 X, n
LDA ADDR_TO2 g( X9 `2 b# Q3 `8 R8 a: C2 B6 X
STA ADDR_DATA_TO   ;设置目的起始地址低位4 B" X; S3 F# F1 t$ W
LDA ADDR_TO+1
7 I7 |( F* P& R2 u) E& [3 ^ STA ADDR_DATA_TO+1   ;设置目的起始地址高位
: H# F* G& O7 w! ]1 \0 \# a- M
+ O  u  X$ i4 P0 R  C$ q0 JOVER_COPY_CMP:    ;复制完成比较' y: b% |# q+ p' W. O
LDA FLAG_OVER
( G/ J( s" Q* r% q& {" l; d CMP #$FE    ;复制完成标志比较
& P8 W( \3 G' k1 R5 ?$ [ BEQ DATA_COPY_EXACT# Q. t6 D8 W; \' d! w- X
: b7 X- o9 h* C' Z  d5 Q# E
INI_XY_COUNT:   ;计数器初始化' }5 ]/ F# d+ M
LDX #$00
4 M/ `- r. J' q  H LDY #$00- i1 c0 b/ V4 v" |! d
$ u" n- v: \) d
COPY_OVER_CMP:    ;地址比较
# N9 h7 j! q+ I/ i/ g& e+ k" j LDA ADDR_FROM_START4 C& w% }5 V3 R, w6 K
CMP ADDR_FROM_END
4 F8 }5 s* n1 w- N" Z BNE COPY_START
4 C) i+ ^9 R" b' |% t LDA ADDR_FROM_START+1
5 h1 R. Y, M3 V; ^ CMP ADDR_FROM_END+1
2 R. C3 ]/ K" ]/ e( g, L BEQ COPY_OVER6 C* d2 n( i  s; k" K0 K

: j' Z; J$ g: O' m4 rCOPY_START:    ;数据复制开始' ^8 T3 e: {$ ]4 X( v7 ]2 k" J0 e
LDA (ADDR_FROM_START),Y    ;读取源地址
' X; @  Y3 V& ~' P9 e4 a% R STA (ADDR_DATA_TO),Y    ;写入目的地址, p% C( l7 q1 b$ j% G
INC ADDR_FROM_START   ;源地址低位递增7 B( \+ M7 U- N) T" O' `1 I
INC ADDR_DATA_TO   ;目的地址低位递增- f1 S$ Q/ @! q! d$ X- V
BNE COPY_JMP
, r% s4 L3 P0 F# G. ] INC ADDR_FROM_START+1   ;源地址高位递增
2 E. h& q. I, x- G8 U' h INC ADDR_DATA_TO+1   ;目的地址高位递增
  b! h3 G$ t4 u, c) v& y2 O9 ` $ n0 L( n4 X5 p
COPY_JMP:   
4 e$ ~( x. G7 c* p! q4 ~* u JMP COPY_OVER_CMP6 [& L& ^% I. g0 @4 @7 h
( d! s) D$ x8 d: O; _
COPY_OVER:    ;复制完成$ {/ r; Z8 v& q& _" @/ B: l
LDA #$FE
% y, [8 ?* W( {  V; o STA FLAG_OVER    ;写入完成标志6 c" D" F! `2 Z% b4 p+ `" W
FINAL_BYTE:
3 o6 p4 B9 o; ]2 a, t LDA (ADDR_FROM_START),Y    ;读取最后一个字节
7 f! x4 I/ R+ R9 W5 t0 p STA (ADDR_DATA_TO),Y    ;写入最后一个字节$ e9 X# W  H; O

. u, _9 t# Q6 w- H: iDATA_COPY_EXACT:    ;恢复数据: T1 R8 l2 }+ c3 M) Z
LDA INT_ADDR
/ G& G- P; M+ P0 |. X STA $2000    ;恢复中断
7 ?3 ]$ G2 d. @8 r PLA/ ~* L: e$ }+ t5 k
STA ADDR_FROM_END+1
8 ?- t" |7 e) L PLA! s$ x. L0 C. r8 B6 P
STA ADDR_FROM_END
- c' C/ w9 P  }8 Y3 ` PLA
' |- v! W$ E# C/ K STA ADDR_FROM_START+1
: m2 c7 U' g1 I0 u, @' H# D# g6 E PLA8 I4 Q/ ^3 v+ R: e
STA ADDR_FROM_START
9 J. U) \0 z6 t2 V  [ PLA
9 L* Y/ V+ I6 z, R- J  Z4 t STA ADDR_DATA_TO+1/ r4 B% f- P5 h* C( j, N% D- o$ O1 B3 P
PLA
6 v) Q; U/ L$ C" I( ~ STA ADDR_DATA_TO# P/ }  {' v! B7 F; Y
PLA
/ x; f' o% k5 W* b6 ]1 B TAY
& A3 {0 i8 d8 K; ^( `( C4 o PLA+ J6 p+ ^4 W" k) O5 E% |
TAX
3 m0 a3 k0 Q4 i  }% `  {5 O, [) D* d PLA
- m0 K1 P; D2 g% A/ ` PLP
: b8 q- j; Z) l* y; q3 f & q3 ~/ P, h" ^* M) z) l+ M( e0 Z0 |
0 E$ r! P) _2 B( Z
2 y4 J: l! c+ E1 Z+ X: l9 B$ c
DATA_COPY_RETURN:1 }5 r) n9 Y& X" g
RTS
+ d6 w# i4 f5 r6 }2 b- O8 h& V: x 8 h: f$ o" @, L$ n( b2 U0 N, {7 j
.ORG $C056    ;精灵指令覆盖) B4 R% D* t  I! `- S9 c1 V
JSR $FFB5. q; u3 U, Y! n

4 }' D/ L! }# I- N# o .ORG $FFB5    ;- I# f# D. G' d. u
PHA; W' v  {9 T/ q2 \+ f, }
  TXA
1 h- ~1 |6 h$ c* M. e PHA5 B$ T" J* K6 W  `
TYA( ]! k( W9 e3 x6 p* \/ |+ a
PHA
8 D, v4 t5 w2 l$ P( X% A LDA $71FF    ;比较7000-71FE数据是否完成复制5 k$ N' T: G0 f& L
CMP #$FE7 y9 A0 k0 a6 t% B9 h0 o
BNE ADDR_FFCA
3 S0 s$ b( e& e9 Y; q, ` PLA
' W8 \( J5 I4 [4 Z$ Z2 I3 Y- {/ o; |0 N0 G TAY; j& B- O- B1 z9 |$ U3 X/ l- {( E5 P
PLA
7 ?+ ~6 g1 x6 J( a8 \. r# Y TAX& `; i8 G; K& F( [
PLA- M/ r" d/ o) N. L* j( D
JSR $7000   ;跳转到自写程序7 q0 p. S+ ~7 o& U* Q- O) m: A
RTS, q2 M1 A4 t) E0 ~2 m8 f9 M/ y& O
ADDR_FFCA:4 p. F" m, V$ j0 Q% W) A+ L
PLA8 X5 x) a/ ^7 k
TAY1 b3 G: r5 Y' m
PLA. `: D  q  s2 F; P/ ?$ D! V0 K
TAX
5 f) z' u3 ]  D, _1 r0 [ PLA
; Z, y% Q$ R+ F RTS
6 o; k: O2 E. U3 h
+ w7 S8 E" R/ ^0 q/ R7 a; @( e3 e$ W: R' ^( ^" F
, z; f2 B- S, Z# Y6 W2 G
.ORG $C264    ;自定义的MAPPER2切页程序2 a, M7 w8 h7 d' s
PHA. W# [( @3 o1 A# F
TXA" v$ _" F7 k+ V) l
PHA; \! ^5 C" Y2 S$ S; f" [7 V: P
LDA $0066
1 R- Z4 w" l& i( f4 s" r BNE ADDRC280
  e- A* D' F( ^( F# S LDA #$07% @+ B, X+ Y7 A% \6 S
LDX #$039 E3 w0 K! _4 ]! s5 m" R* J0 ^7 L
JSR $CD9B    ;自带的切bank方法
( z' [, C$ C1 {1 ^ PLA
  T4 w3 b- T# Y TAX$ `/ n7 q- L, l3 s+ g) W
PLA
0 j& |4 Q9 [! S/ i# t) _9 J* j JSR $8000) H# Q$ j- D( W
LDA #$06+ q: ?/ I: V; Z# a! a4 Z
LDX #$03% w: X4 X% Z: n& y
JSR $CD9B    ;切回原该切得bank(可以不用)2 @" ^6 l' M9 ~  l1 X7 J4 K% U
RTS- R: Z8 B0 [& B0 ?
ADDRC280:
9 i% [+ Y( f) k, h4 ^$ H PLA
8 |2 r" d" f" `/ e TAX6 g0 w8 M$ u" g& J: k7 K
PLA; @) a: [$ g# y" y8 I  H
RTS/ E4 C, Z' i8 f+ s0 M% I" W

7 }  `; L& X) _ 2 O) u' t: g5 i5 {3 q! T4 j; I
;[FC][最终任务PPU][END]/ a( A' c! U# K8 a
.ORG $C056    ;跳转到PPU重写程序
1 ?7 p" J& `" _* w9 b6 ` JSR $7000
) f) @; |6 y3 z; v$ n
4 @9 B, l5 r- w' _ .ORG $CEBF
; t& U7 ^1 a& h- ]# E" g JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入9 Q; S4 C1 W7 K; C
  . o: r8 v/ P6 p( J. Q
  .ORG $E460& D+ I) q7 [2 z+ {: ?8 j
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入, a; F( l+ B% s& T" G# |
  
4 P1 L3 M4 r  z' Q; x .ORG $71F0/ E* P* j0 M! T
STAGE_DATA_WRITE:
5 t+ V' _; T- r  LDA $6010, K: ?# D; h( H
  STA $1E    ;关卡写入
3 ?. }/ B# b7 j2 N* P9 {7 W' c/ V  LDA #$00
7 F) T/ Q% J  P/ q& o% J  RTS( U  X" m# U5 V1 Y' t  x
.ORG $71C0
- j7 w, K, C2 D# B! E- M6 JBULLET_DATA_WRITE:    ;副武器数据写入
7 S8 D( k2 f  H4 M  D0 \! ] CPX #$0E
/ C4 R3 w2 [) y' _+ g BCS P2_BUL
0 |/ b4 b% g  ^- ZP1_BUL:, l, T- M+ n. S; K6 _5 l
LDA $6004  g8 f( o: [- t  Q( S$ W) h
JSR $D7D0    ;P1副武器数据写入+ ~* n$ b2 U. I; J2 h. A8 b, l
RTS& }/ [) C; _/ q, T
P2_BUL:
! A) X- _9 g3 y0 A. Q9 N LDA $6005
- N1 x" X" z7 b, @7 X+ [$ a JSR $D7D0    ;P2副武器数据写入
/ S* q- T$ x( a- v5 n RTS% X7 M9 ^% {# i* d2 O( _
: L7 X6 E$ ]0 L# K

3 W& D9 O% o% P, o .ORG $7000
! v3 W; s# Y& d+ e  # M8 G2 I; `4 D% V
STY $4014    ;补上覆盖的精灵写入指令
( ]' B; W% Y  B; f' w% x PHA
, \4 g4 U7 x+ y3 b" \1 f/ B8 Y TXA1 x8 [3 z# L/ v) U
PHA
' \, r- y( I8 P  Q8 D& B, a TYA
$ h' i! I* f4 {' a PHA; B$ L* Q$ G8 Z% t1 T+ H& C
LDA $0C6 X# b, I# ^: w. n2 u
CMP #$01    ;比较是否为标题画面
6 G7 N8 z# u/ r' z) u BEQ PPU_STAGE
0 t$ Z( u, A0 \' Q: i& ] PLA- R5 l0 x3 T( p3 U" i: \
TAY7 g/ _  E8 |9 q$ {8 T
PLA3 m+ C1 w' s+ D7 |8 p
TAX" L4 {  m% J  K4 l4 h. w
PLA
; o, ~( f( C: l# m% Y: u3 E RTS. h- B6 M+ [3 S3 [' ~: l: N, H- v5 C
PPU_STAGE:    ;STAGE显示程序
. {, e. s$ q  w5 d: p LDA PPU_ADDR_DATA
) H4 u2 E4 U, m6 } STA $20060 I7 v) t" m+ @+ G7 w
LDA PPU_ADDR_DATA+1
, j/ g- r* I  D3 m# O- ^ STA $2006    ;坐标设置" e9 V) e% _. D
LDX #$009 Q7 p* e$ L7 e9 Y; Z- g) f
PPU_STAGE_WROTE:    ;写入STAGE字模; W# P: W- |6 W
LDA STAGE_DATA,X
. K% k8 Q  M8 W2 {% v2 T" W! ] STA $2007
3 G6 a. B% r1 x INX
& Z/ ^4 I- Z4 x" R  f CPX #$06
3 J) C9 K5 W0 o7 y  P0 f6 i0 ` BCC PPU_STAGE_WROTE
! M2 q3 l  o9 M0 r/ [& a LDA $6010$ C# y5 p9 W  I2 J) C1 X
CMP #$FF    ;关卡数据初始化条件判断
! h; g3 q: G9 U+ Z3 o- q4 h$ g9 e% J BNE KEY_B. ~( u2 f: }$ m/ ^& {# N
LDA #$000 V" D* T5 Q& A$ W9 \
STA $6010    ;关卡数据初始化
0 q' [$ H0 N! g* s3 r/ |' ^$ KKEY_B:    ;关卡减少
( @. g0 _3 v+ m LDA $04
! K, b. H' Q7 u6 Z' k AND #$42    ;按键B或左减关
6 i5 V8 Z' k5 o+ D5 k BEQ KEY_A% A* }# g# f+ u. L! g; f0 W
LDA $6010
. h' K6 ~, E' b/ t, s8 H& Q6 z CMP #$00    ;关卡比较
/ }5 I# `$ u( _, t2 s BEQ KEY_A& x" N5 x& k2 v' |' X
DEC $6010   ;减关
+ w* \# y" U  ?$ o3 iKEY_A:    ;关卡增加
  Q* l  q& f& s  k1 i; `" ]  w LDA $04+ T1 K, s2 h, U5 s1 Z% n% e9 J) a  z
AND #$81    ;按键A或右加关
% y- }+ E3 M4 D BEQ PPU_NUM_WRITE
( ^, H- h0 ]2 f$ j0 v8 Q LDA $6010$ F6 S3 z' @# N$ N4 k6 b. S
CMP #$04    ;关卡比较
' V$ Z8 P/ S! l, A% R9 V1 z% i BEQ PPU_NUM_WRITE6 m& q  P+ e5 j
INC $6010    ;加关
7 f* @0 d# d0 I/ U/ S* z' BPPU_NUM_WRITE:$ m9 w( |( e2 `: {3 p* u* j" x& `
LDA $6010+ Z$ _! H4 P6 ]: u0 t5 i; B, p
TAX$ f' g0 P6 L. T# [
LDA STAGE_NUM,X    ;写入数字$ h5 N1 ?5 ]# y8 O' h
STA $2007/ |' l, R( F+ h2 }6 z( f% \. O- @
PPU_RTS:
) v' z1 t( b# {+ q! k; j+ X PLA& O5 R& m, Z3 P' N+ C
TAY! |9 n* r( q! S0 v  {
PLA
- k, T4 @" q& L  q: u TAX# U5 A* i4 O' e
PLA! f# c4 k1 z5 n' u; g
RTS
# J. ]7 h6 e! I" @" ^ / H+ ^$ a/ q& \8 x1 W
% p! u" m6 V% G  Z! c1 j: Y
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据" X, V' }. @2 ^7 f: a4 F' P
.BYTE $EC,$ED,$DA,$E0,$DE,00
! H& `; |/ N6 K" O' vSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
1 Y# c& X! `" W; T .BYTE $D1,$D2,$D3,$D4,$D5
/ {, ^5 E( i' X/ H& K
7 _( d5 H' z* ^  o. C* y, RPPU_ADDR_DATA:  h' z3 F+ g5 l. _4 \3 @9 Q
.BYTE $23,$0C- g$ Y2 g. H6 F* D* H/ z6 U

7 {$ T. X( ]* A8 T6 Z

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2024-11-19 09:35 , Processed in 1.068359 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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