设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
3 M* K+ K8 x& o0 o
5 v- t7 a  z: ]! r得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
9 ^: K. H' J2 O5 F然而,今天想到一个思路.; D; g: g, }- }5 R) t: C2 L4 b5 T) V
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.7 _. k$ P( q9 ^0 ^/ L) q
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE: y7 m- P& b5 J2 @: C* S, e* I2 `( o
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
7 g3 i# W/ `1 Y: V! `% |% V6 Q+ O, z' M

# [5 O( r' E+ o- Y;[FC][最终任务KEY][END]: f9 T) ^- z* h$ m2 E. @4 r  p
button = $04    ;单次按键" Z/ P7 Y8 w/ v2 d1 u3 ]
flag = $6000    ;功能开关标志
0 q3 ^7 ~; X( xpause = $000E   ;暂停地址7 G: J5 |. s" I- s, p

7 }' I. Z' C3 w( P6 N) G .ORG $8000
2 _/ Q% Q- s. Q& m  [ LDY #$08    ;自带的按键程序# ~1 y2 I% M; O: ]" O& ~
ADDR8002:/ \3 d8 c9 G+ V& a- _' X
LDA $4016,X& B# L$ p4 r# ?
LSR3 l1 ?2 Z8 ~2 D3 ~9 m
ROL $0021% H+ N! O4 d5 r4 |5 Q/ y" q
LSR) ^$ t% L  c. I) y: A4 r( y
ROL $0029
* G5 I3 w* n5 n& E DEY7 C# N6 x5 [8 Q- p8 b  O( }! U" J
BNE $8002" f% C8 l9 p3 k4 ^3 U) P
LDA $00210 j* k7 k2 F$ O9 c' f; E2 R* H0 s- e/ Z+ e
ORA $0029
- @; j* @0 l0 l1 T& z$ ?& i STA $0021
" t% u/ N8 d0 Y, H' h3 g8 W  e+ p4 c LDA $0020
: a$ ~4 [# A& s5 ^0 U& g AND $0021( S7 g5 Y% c2 b3 h0 z) x
STA $0020
& x! @4 G- a3 F# S LDA $06,X
6 G3 Q" z( q' e5 K0 B* C EOR $0020& p. E& \1 ?9 `  D. W
AND $0020+ x2 z% C/ H1 O) c
STA $04,X
/ ~) y$ `" D3 h( z- d LDA $0020
* y$ d' m/ c: N# |) ]0 I/ P) v STA $06,X
4 Y2 r+ l3 p9 x. I2 X+ i JSR KEY_OPERATE0 f$ `; C& P( y2 q$ a! z) G5 _
JSR Function    ;功能调用' Q" ]' B* t/ V& l6 R! ]
JSR Weapon    ;武器切换调用
9 V8 z/ _% G8 F! P" a8 v* D. [ JSR Power    ;威力调用
7 ?: v* \1 X! }0 W1 K JSR BULLET_NUM    ;子弹数目9 Y; b' S4 j/ A3 k
JSR BULLET    ;副武器类型2 h& n$ ~' l' T7 i7 E4 G
RTS
2 p( d2 O6 ?# B+ y% n! N9 K 3 @4 [/ W4 F+ U  H+ V& L

& w; S$ g; n: W- B( \7 h6 u
+ I4 c9 `4 \  M. v0 H. ~ .ORG $8050$ ^. w6 M; ^/ Z$ u, p! o
Function:    ;功能
! S' a6 M. v7 i2 _WUDI:    ;无敌
) Q: ?9 g1 _& o LDA $6000,X
, {- {. E, `3 C' \" i AND #$08    ;开关判断' D7 c  C9 _" J: O  c! Q
BEQ LIFE
- a( L# o& \% N- Q9 H) p. Y5 O LDA #$05& g' F6 B' M! Q# o2 A
STA $05DC,X    ;无敌锁定  s5 n- K* F0 O3 G: v
LIFE:    ;生命, @% v# D3 P" ^& B) M3 Z) y  H9 m
LDA $6000,X
6 e8 y6 y- k; k, y( f) g5 Q AND #$04    ;开关判断
2 ^7 I/ Y1 u0 s# l( i  N BEQ FUNRTS
% W- F) s9 X, q! Z" U+ w0 L LDA #$05# q5 E7 s5 \% O% R; e! V
STA $1C,X    ;生命赋值
8 F0 i, O; R7 C; F4 `& h1 C( c$ BFUNRTS:* f  s( [' s' Y
RTS
2 ?# t3 j, R# J! ]1 V3 A7 l1 e5 g6 M " h* p) i6 Q- A
Weapon:    ;武器切换
7 `1 V& v; E2 g LDA pause    ;暂停状态判断* m0 z7 P, x( r& ~
BNE WEARTS
% _1 O/ o9 c$ I6 h) b* [ LDA $04,X+ [; C) b& a; L( ~9 s/ h
CMP #$20    ;选择键判断* X( L' \- G# B" i0 S# [
BNE WEARTS
! I' \, X( k5 z+ l LDA $12,X
. `: M3 @1 o1 J) L. {/ m6 V! f: | CMP #$03    ;武器值判断
$ y$ I1 ]( i" J, K# T. I! y BCC WEAINC4 ?7 n: l& I2 ^# X3 G
LDA #$FF
# q9 O9 u: ?7 W" g+ z1 B- o& X$ E STA $12,X    ;武器重置
" z5 h3 N  N3 Y/ m  _7 V, \WEAINC:% h! g. S. b5 V8 ^" g
INC $12,X    ;武器增加2 U3 V" X  B) x; F# N- h6 m0 I: H
5 ~2 t: p: J- E- x# V; o. x9 m; j
WEARTS:4 Q$ h# ~! L0 [$ p( M
RTS
4 \8 I4 S$ Y, B0 Q! Z* ~* v) V
0 D3 ]/ K0 u" `& V: r8 R! HPower:    ;威力" w. n! g! V- A8 m6 u
LDA pause    ;暂停状态判断
" L  X& v% O' k7 l7 z; P. K BEQ SPERTS
) N. I% M5 @" W3 O# F, ^* yBUT_LEFT:4 K9 e0 e( Z- ?
LDA $04,X
2 Q2 K" D  n# H. @ CMP #$02    ;左按键判断1 O9 I3 {! y8 b# z3 }; f
BNE BUT_RIGHT
: b/ Z4 k, w% k( E( z$ ^ LDA $88,X& j: A7 @: z' I. t
CMP #$00    ;威力判断1 W% F+ [5 U4 D# W
BEQ SPERTS  s$ d$ w* Y( C) ?3 f
SPEDEC2 ?" q: U. G# i& F8 T9 _
LDA $88,X    ;读取武器值9 B9 S% g, D+ O# o: u! ?
SEC' J0 Z% X5 p! m
SBC #$08
7 B/ {" p" a* ^3 X- L STA $88,X    ;威力减小6 K1 y7 t! V0 t' v. `
BUT_RIGHT:2 J# h9 o' {4 ?$ [1 \) N0 O7 F
LDA $04,X
- Q+ R0 n7 n( c) m( c/ m# K/ F' } CMP #$01    ;右按键判断. J" `; V0 d, `7 C: F1 `1 b: u
BNE SPERTS( b' I% r2 L8 p7 t4 u$ v& d
LDA $88,X; L6 F- ]) S6 v' C2 @4 S
CMP #$10    ;威力判断
- A- U' T& D' n$ j9 m BEQ SPERTS
. P1 s- _& B, L' `: C- dSPEINC:
3 ~) z5 d* r8 F. A; p6 h# S LDA $88,X    ;读取武器值
2 q+ o7 {( r6 l1 J  f$ Z2 h CLC
% |4 P+ [; j; ]; n5 h ADC #$08
7 d) W- Z, D; {4 m$ j/ e( h0 O STA $88,X    ;威力增大
; m  L  h' j9 W- y/ M
4 \8 d/ g+ C" `0 S/ {; |SPERTS:
4 o9 i, k8 K0 B# f' }0 u( L RTS
6 B3 [. i: d) ^7 p
9 S* _) h. j+ u) lBULLET_NUM:    ;子弹数目% X+ E- e5 ]; r: n  G
LDA pause    ;暂停状态判断/ a7 T' ~! n1 K4 G. ^4 a
BEQ BULRTS: R- r  {3 S1 V$ H" T# f
CPX #$00    ;主机玩家判断
0 v' V* o% s$ a9 { BNE BULRTS
* A% l$ K/ q) H# S( I/ F LDA $04,X    ;主机玩家判断- J8 x* F) A* J+ c7 @& u5 ^
AND #$80    ;按键A比较
9 ]* J7 k6 T' _0 F& n. q1 N BEQ BULRTS  C9 l" K8 o. q( U, |, Y) J
LDA $87    ;状态判断
* g, ~/ x: n- E0 l8 h8 S BEQ BUL_2( k& n4 c; W: K, F; L
BUL_1:+ D! d, M: M: T9 X8 g$ `& N$ v
LDA #$00/ U2 C1 @# q0 A6 }- p
STA $87    ;1发子弹
  V. X+ x4 @( v; } BEQ BULRTS
. ?3 c/ @# H- G/ x8 f: v% Z  ~1 gBUL_2:. L. q/ n9 T& ~) m
LDA #$01
$ E" N# ]7 g9 |6 O) u. c: g  y9 P STA $87    ;2发子弹
* r' ~: O. s4 T3 F& w4 I
  h% Z- C$ F4 p5 n) [) e9 h5 OBULRTS:9 Y: t4 U  C& T" o/ @; d7 @% E
RTS
" G( X+ m7 G" p) r4 ]- }
- A( J$ S! |3 a! c# F- M5 K8 Q# w4 F- n2 e) Q+ k  ~
BULLET:6 \/ O; F! F; l* J. H/ a
LDA pause    ;判断暂停状态
, b3 o8 t7 \8 _' ?5 L0 }$ r: m BEQ BULLETRTS
: z; w1 K, a* ?* }- J  c1 C LDA $04,X: X/ \) `) m+ i9 V. L
CMP #$40    ;按键B比较( e4 ^& S7 F7 f; |
BNE BULLETRTS
/ ]) m+ R% q; L2 M( B LDA $6002,X    ;读取副武器5 h) p- n4 |' X0 S0 p
CMP #$03  ^- {2 M9 H$ u# t
BCC BULLETADD9 g/ @- o8 j* e& r) s2 f+ Z
LDA #$FF) n6 h" t( u/ ~5 T2 c- W
STA $6002,X
- \/ A) {: n  Q' D# d, qBULLETADD:( K& P9 @' D; a3 W% A" E3 X; I
INC $6002,X% ?5 \8 y: t9 Z/ @
1 B! v, W8 k$ T) p- Z
BULLETRTS:# Y* ^8 B( X' r: ]! u$ j: v
LDA $6002,X
, r( s8 T3 }' e- n/ s3 P TAY
6 F8 f( B( O) A- K6 e+ H3 Z& D* P LDA BULLET_DATA,Y0 E7 E7 A  {) d* [1 M
STA $6004,X    ;写入副武器数据
1 k3 ~! ?8 L' Q RTS& p& L6 Y/ z! }

) M4 B3 B/ X, G0 a; E$ b8 Q ) [/ u, L/ n! H4 O. g* p
BULLET_DATA:  a" p% W2 l& n
.BYTE $06,$02,$03,$043 k3 n* ]  A+ [8 I
7 p) h, h9 u5 ^& M: c2 e/ c

& `6 T' e6 K" S6 A, W# U 2 [9 S! R$ d+ m2 d
KEY_OPERATE:    ;按键开关操作% H. o0 c' n4 L" v2 l
data_protect:    ;数据保护
! Q% G. X3 B: a% U2 s- X PHA! R2 q$ Q/ ^: D
TXA; m/ g$ Q! \. H! S. t
PHA
6 |( y) m, X# K! S" M TYA
/ H% S  K2 A+ @# t' R PHA
& Q/ V1 B4 }7 x3 y/ p) `) ^! `' ~6 l& G& |, n/ f
FLAG_INI:    ;开关标志初始化! s2 U8 v2 D) a3 b

* N/ V  A1 h, x LDA $600F2 _& l$ E" t) H- _
CMP #$016 y) i: J7 r2 a/ g8 L7 p8 {8 D
BEQ pause_cmp, \" f- W" _* r
LDA #$00
0 x! E8 b1 u6 X STA $6000
) h% \' G, i1 t STA $60016 ^# A; x1 i7 `# _
STA $6002
* k* v( f& U4 i' X8 _, x STA $6003; O5 V: m2 ]4 O  I- o
STA $6004
# b4 F, |! o7 U$ U3 n5 I6 z4 Q' b STA $6005
0 H6 G; }/ u, ]3 s LDA #$01. j; J0 X9 h  M, h+ R" f7 S
STA $600F
+ q, q. j9 G" E" Q: n& y) O & M9 {( {) x& n- [& P8 b# Q' }
pause_cmp:    ;判断暂停状态
9 d. R( i: J, ]: a LDA pause: I% u5 y$ l' r4 r8 M
CMP #$01    ;判断暂停状态
" m6 O. t" _" [" c BEQ button_press
! T, \& Q7 V  F8 ? PLA" g9 c; ]; A+ ~
TAY
" }- U, v( o- [( P+ e! l$ I! { PLA
- Y3 f/ y5 J8 [$ s3 Y4 E TAX1 a1 K  c- I4 _
PLA$ e& ]' e0 e, I  [$ i8 H: k
RTS+ m( \, U- `  ~' Y4 U% u/ n
) \$ u0 f2 v+ v4 @
button_press:    ;按压操作: m8 d4 Z' L  K- i
ini_Y:/ V* ]& t8 b5 q- E% P7 d
LDY #$00/ X0 ^  s5 O) T& f& _% [
button_cmp:
& O1 [. A5 \7 j' S2 U LDA button,X) g1 R, P! C. J& S  Q1 E
CMP ora_data,Y
5 U5 c% X: r+ }$ I7 G( U6 d* a BNE count_Y_cmp! k; ^+ W0 j" V4 G* c/ S
flag_cmp:& v7 G- l* T% \$ Y, O! |
LDA flag,X$ E' A+ u& W: F* t2 T
AND ora_data,Y9 M3 {7 U2 B' j1 p3 `% S% H
BNE flag_and
, I2 D2 y; C, V. r) b; ]% qflag_ora:2 c1 q5 k8 N6 z1 a
LDA flag,X) U& S- F+ B5 `+ Q' ^' _' f' n
ORA ora_data,Y; D  _1 {( |2 Y; R1 o5 H
STA flag,X
) R1 ?' {9 A1 m: A# q( D5 `9 s6 q BNE count_Y_cmp2 P( L3 C4 b0 N% |5 |2 I( Q& K, b" D
flag_and:$ G, M0 W3 G/ H. @8 B
LDA flag,X) w8 [) K1 K+ p- y" m
AND and_data,Y8 l4 [0 T/ V) T0 p. j: G4 [
STA flag,X
. C+ S$ G4 |" vcount_Y_cmp:, y( I$ [4 W) X
INY
8 b0 @) y. U, O4 T9 f CPY #$08
$ i% e: |- `; i BCC button_cmp5 Y; ]) z( M- `9 }

; q1 u* ?6 r$ t+ V' |- u" \) ?data_extract:    ;数据恢复
% z3 G" c% Y( j- t# X$ ~# c  x- Z" v PLA; F/ ?5 E8 t, p% P# Y
TAY' U! h& T( C, p4 S
PLA
" r) r1 r0 c: C! Z, A$ K, X TAX
4 A( N' u8 l, f PLA- |! X; {4 o( T7 f6 q

- l/ R9 ~+ T! P0 areturn:6 |4 b! |4 z5 g$ g* R
RTS
% w. Z/ h9 _# V- D' P) U- w
8 F; ~1 [0 n, I5 M- |' s4 ~2 ?ora_data:   ;按键相或数据: B! z( r* o% ]9 n6 d8 K
.BYTE $08,$04,$02,$01,$80,$40,$20,$106 m3 F/ k" f7 C+ S/ y; B
and_data:   ;按键相与数据0 i# d. J- k0 q4 u" K
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF" R. z9 m' ^0 }) y- P" Z

: e- |2 u, S' ^6 d6 `- W
9 i1 ~3 k/ j/ j2 { ) F* I2 {& O  Q5 z
;FC数据搬移程序 BY FlameCyclone1 N# N  q; D& B* u6 v3 s* j
.ORG $8200. U1 ~6 n. v8 P. {4 x4 x: V
JMP DATA_COPY_PROTECT. {6 `0 [* `! R* B0 n+ ?

- e" A4 N6 U$ Y: c- [5 x7 c$ a' v0 ?ADDR_DATA_TO = $40    ;目的地址5 {  a3 T& Z* n" |% m! U( p
ADDR_FROM_START = $42    ;源开始地址
7 o3 ]8 R; n. E  Q8 h5 n/ LADDR_FROM_END = $44    ;源结束地址
7 Q$ ~+ \5 H" I# A6 j. o( H5 L) n9 Y: K9 K! r8 X3 D
ADDR_TO:    ;目的地址& R8 e& B* ^" f7 |+ S& _, T
.BYTE $00,$709 [4 Z6 c$ @; f
ADDR_BEGIN:    ;源开始地址1 q! {- h" Z% `$ o) s9 m1 \0 Q3 k
.BYTE $00,$83
! N8 f$ _: w# \ADDR_END:    ;源结束地址" @2 \0 ?" L  \# [% F
.BYTE $FE,$84
4 a9 q4 O$ g: @) z+ y* o* {# Z6 n: D! b" V+ p2 N) x. p
INT_ADDR = $08    ;中断地址9 u, ]. P# M6 S+ W, j
FLAG_OVER = $71FF    ;完成标志
  e/ G, ]* i4 o
* D2 o- {2 T, I2 L: h" u' D
3 l6 V6 B4 g! l/ _* NDATA_COPY_PROTECT:    ;保护数据& V9 C. a- C! ]: e2 Q* G5 [  M8 E
PHP4 L" J$ S2 h' r* u
PHA
5 R7 y* x6 K" `, w, u TXA
' Y* I+ H, S7 X/ {; Q PHA% X0 r2 ~2 j3 ?7 ^+ y% W# O( K
TYA
7 Y. s  m$ l. L# i" F/ l% a, P) ^ PHA$ E1 G9 C1 j% p8 }$ h* ?$ \
LDA ADDR_DATA_TO
6 L0 `7 n( r5 f) m6 {$ H. J PHA
: ?4 P. Q; b( }( Y9 V$ o1 e LDA ADDR_DATA_TO+1
0 P  R- }. W+ x' O& H1 _$ m( i PHA
; D/ F( A8 y  L) O, Z LDA ADDR_FROM_START
: u1 j5 D9 v3 i& _# I) X$ R# `! A1 k PHA0 Y3 C9 y) z' k' J
LDA ADDR_FROM_START+1/ m0 a* s. ?- ]! f) U  a
PHA0 ^, L: _; Y) ~  c) J) n- k. R$ Y
LDA ADDR_FROM_END9 u8 W& ?$ T4 |& c# N
PHA
$ i4 Y* o6 P8 o6 a6 C) j$ ^2 C+ n! j LDA ADDR_FROM_END+1
# S3 g; L) n0 m$ g; H( ` PHA( w7 }- A3 T& [- j+ T2 W

2 e' Z; q, X, R- f( j$ r* M/ OOFF_INT:   ;屏蔽中断
) r* \7 h& P( K3 f# x4 k& E5 Q LDA INT_ADDR
7 R( Y' G2 G: k. }; G1 p AND #$7F# x  H4 m8 J4 r* W' z
STA $2000    ;屏蔽中断
3 S; o1 O! `" @0 q3 c" D6 x) P. N/ f, K) B/ [# N
/ v7 W0 E2 M# B: H  n9 b; k* P# I
SET_DATA_ADDR_START:    ;设置复制起始地址
7 l8 S: u$ ~  F  c( m( {; h: _7 k LDA ADDR_BEGIN
# I% m* I! @: `9 V STA ADDR_FROM_START    ;设置复制起始地址低位
+ p- l- z/ b, q1 _ LDA ADDR_BEGIN+1( ~5 Q1 x/ p" ?- Y) E0 C+ ^
STA ADDR_FROM_START+1    ;设置复制起始地址高位' B# a5 [) U/ L1 [( g- c. N, d/ N
% k4 ~. V" V- |/ B2 b
SET_DATA_ADDR_END:    ;设置复制结束地址
  {# y$ A( h- k5 y4 S/ m; h4 N LDA ADDR_END6 k# a. w& j# Y5 t4 M1 i, ^
STA ADDR_FROM_END    ;设置复制结束地址低位
" k, H2 l9 R, S; e9 D5 a4 v6 E" K LDA ADDR_END+1
% k; }' O' ~4 ?0 b# D: F+ T; R+ L STA ADDR_FROM_END+1    ;设置复制结束地址高位" a' c8 A3 K2 `( O7 k
; ?2 Y  c) e( r4 Y' ?
SET_DATA_COPY_START:   ;设置目的起始地址
4 a$ n0 C  n6 c: { LDA ADDR_TO6 P5 e8 z% P& H6 {6 ^" X
STA ADDR_DATA_TO   ;设置目的起始地址低位
4 o$ Q" ^* i$ r6 L+ H1 [% p LDA ADDR_TO+1
! M/ ?! ]$ J* b$ U2 E6 z, z8 g STA ADDR_DATA_TO+1   ;设置目的起始地址高位  s$ W0 E) T. b( Y+ t, E. W

) x+ i" \/ s% N8 Z; I8 \1 N8 c! sOVER_COPY_CMP:    ;复制完成比较
; O8 y# t* P+ s$ V LDA FLAG_OVER$ ]$ A: C5 O, v4 ~% g1 V: U2 A' Q
CMP #$FE    ;复制完成标志比较0 |! k4 Y7 i5 d% {: W6 f
BEQ DATA_COPY_EXACT9 L/ X5 b0 A, U, u% G6 f9 G
( ^1 B) n, K+ Z8 D( P% E
INI_XY_COUNT:   ;计数器初始化
9 @; Y# H+ |! t1 e* @& E LDX #$00. i+ B: U" \$ W& g
LDY #$00
$ x" R( |" i- n% I( J
7 M' a2 ~% V: A5 n( _COPY_OVER_CMP:    ;地址比较
0 J" ^. |3 e% [+ k( T: x, U LDA ADDR_FROM_START+ ^. I( m/ n* P% v' y7 L/ A+ r
CMP ADDR_FROM_END
' V- M1 ?! g7 _ BNE COPY_START
; t  `8 }/ j- M0 m5 h' E7 O+ d& } LDA ADDR_FROM_START+1% c1 {% O/ i+ H: G& Q
CMP ADDR_FROM_END+1
, j, Q) [9 r9 Y# @: Z BEQ COPY_OVER% x" U0 A6 M# b. u7 E( R$ ]( s

8 C$ I* g  N. N* j3 _1 i5 eCOPY_START:    ;数据复制开始
" T; ]# W$ ]% r$ @' F LDA (ADDR_FROM_START),Y    ;读取源地址
. b6 s4 x4 y2 V0 V& E STA (ADDR_DATA_TO),Y    ;写入目的地址% N0 j! |; p8 R2 X' @% ~/ X- h
INC ADDR_FROM_START   ;源地址低位递增
6 E8 H. v+ _- X$ \% W0 e7 x% w8 s INC ADDR_DATA_TO   ;目的地址低位递增! N2 k) |+ ^! O4 j0 ~5 Q8 e# N, T' p
BNE COPY_JMP. P6 S/ M0 [& g$ b
INC ADDR_FROM_START+1   ;源地址高位递增
. B0 b: \5 g/ z# ^' u6 A INC ADDR_DATA_TO+1   ;目的地址高位递增
4 G& G" ]1 l, S- M" H
% e, m8 ]! ^  ]2 U6 \' W' S$ a. rCOPY_JMP:    ( y* X0 I+ L1 Z" n2 j9 Q
JMP COPY_OVER_CMP
, o# X. P* t: [7 R; W" u0 m' a7 y- M( P$ ~6 U4 e
COPY_OVER:    ;复制完成
; @$ F( \3 n1 ~/ F- I, a2 u LDA #$FE9 f) R# A) J2 ~* I7 _( ~
STA FLAG_OVER    ;写入完成标志
3 |5 F; p0 l& R& FFINAL_BYTE:
( _0 J- k% K% a8 W& U) T/ b  x/ f LDA (ADDR_FROM_START),Y    ;读取最后一个字节- E3 O- r8 `1 T* Y6 u# ?0 y
STA (ADDR_DATA_TO),Y    ;写入最后一个字节0 f2 u# y3 w3 g7 R5 f. H. e- `

- z, [5 v9 y( Y$ N/ x+ t) E5 lDATA_COPY_EXACT:    ;恢复数据; g7 ^) T% z1 |9 G0 [
LDA INT_ADDR
9 U5 K% e; u# l+ g! {# N STA $2000    ;恢复中断# S- S: b# R$ G: u
PLA; U0 Y: x+ i7 V9 H
STA ADDR_FROM_END+15 D1 [' H* A& C& U: t1 d. A
PLA4 N7 e8 s( `: A$ J6 H
STA ADDR_FROM_END5 Z0 u. D2 X4 ^: d8 Y1 k; `! y0 Q
PLA
* q! N6 V- R! E1 y8 Q: x STA ADDR_FROM_START+1
' g4 y$ ?; ~" V* i PLA
. a. _8 w# @9 U2 I( W STA ADDR_FROM_START. ~8 X# A# \4 q* E# Y5 I! M
PLA9 J( B5 y% u; |% \4 g
STA ADDR_DATA_TO+1  a. ~0 B$ v! O& |; |  H- g: z" s
PLA" J. o+ l; d0 {7 x. N" Z) p$ X% U' f$ h$ o* Y
STA ADDR_DATA_TO
% o! H! X; M/ p9 y+ B; {/ w PLA
) \) S6 i/ j2 e& L TAY
) c8 |* f/ D: ]" ^ PLA1 B+ Z* z$ B# g
TAX
  m2 w) n6 b2 n; V! y PLA* i2 x( l# i& l8 Y) ^4 I+ W
PLP
" H; M; j" `4 c/ w- z- F- O8 ]   W5 m( H+ ~% a+ b$ J& e, i

6 ~9 A, D5 L5 S/ G! C ! q# i7 p3 a* s* X% c( S
DATA_COPY_RETURN:( L0 Y5 E  p3 _: o
RTS! G: N% |) }8 G) {/ C% \5 o

8 h: N4 L" L& }) C: k5 Z .ORG $C056    ;精灵指令覆盖8 d7 c, v& x3 a" ~
JSR $FFB5
- q$ J1 ^+ M" @3 _# \* V* a 1 n7 o9 i2 r+ {- S! h* ^( q
.ORG $FFB5    ;# M1 g( M2 P/ a. G2 u
PHA9 m$ q: G4 U8 j+ H' h
  TXA" F6 s- F3 i' D7 ]8 e$ h; z
PHA: ~* w( I# K3 |+ H& g1 @* `
TYA
$ q( O! W# A5 Z9 V PHA7 m" j! q8 h; O8 k( M" G6 T
LDA $71FF    ;比较7000-71FE数据是否完成复制
. j9 x' o+ b# a7 e: r5 s2 A4 ^# Z CMP #$FE
% b: j$ i7 v% l. L, U9 r# t, f& I BNE ADDR_FFCA( A6 Q0 V4 c! Z( R  }
PLA5 g: {1 ^0 Y7 K9 W. [1 g, x0 w" u- h
TAY
- Q: {! E2 P0 ^6 X  V+ r# A PLA5 n' X$ _5 D. @6 V
TAX
$ Z$ O; ?4 ~+ E# T* Q PLA) q+ J$ c: B+ C( z
JSR $7000   ;跳转到自写程序! J8 J7 \( A* l6 b) l
RTS, T7 v+ ~4 K" Q) m
ADDR_FFCA:
' g6 [$ }8 v% k' j9 a PLA
8 L) Y( \# |% }2 c0 X9 y TAY
6 {$ W" _% B. N5 I$ n/ y PLA
! O) F! ]8 M- }* L! r7 C TAX
0 @6 X% i6 g& z9 P) N PLA
5 }: q( U$ @0 Q$ ]0 P2 u$ g& z- D, K RTS- S* p- }! x9 u1 A* R& n; d# U

6 S6 I) V0 V! i4 \/ p, g0 h2 S8 K/ [* |, s% T, N
  F! I! a3 o; o1 n# y7 f: i
.ORG $C264    ;自定义的MAPPER2切页程序1 n: `6 |# }4 P" @
PHA& p- B0 A  z* S1 }+ f3 P8 Q# j
TXA, g, o' R" d! j
PHA
5 h( W; t0 Z8 @& y" L LDA $0066
' Z$ b% H. [. G BNE ADDRC280
) ^/ G7 E- \: f, _2 C1 j0 C LDA #$07+ [- y; L  F% L  J1 X+ b0 u" R$ @. w
LDX #$03. F/ ]7 h% k3 G- h
JSR $CD9B    ;自带的切bank方法: O6 f2 a5 a  e6 E4 z% {
PLA+ ^6 x8 e4 B" y
TAX" B$ _, o; k, R5 M8 Y1 f1 Z
PLA
1 z5 q, Y+ e$ ^+ S; u: I" \ JSR $8000* W) M) I3 f4 j
LDA #$06( s* K& a+ }' F5 x1 X
LDX #$030 H8 c* {. |4 n9 f( M- Q
JSR $CD9B    ;切回原该切得bank(可以不用). Q) }- I* ]2 M) T! R2 M
RTS
5 d% P' f! V0 w1 |; x6 G& c0 w5 pADDRC280:
* Y' \) r8 J( o/ W* b PLA
5 t9 j. M. @, B- I1 t/ l TAX
& d8 U0 m1 W/ I; u2 S PLA) b% {4 O8 j. w5 m
RTS
/ @3 I# y+ a# K/ o* P8 U& }- b # R4 A0 `0 X# p# B# {/ s- t

6 D9 T  @) p2 [  Q$ a: H9 g;[FC][最终任务PPU][END]
$ X! y3 w" D! L8 w+ M: C& K+ v2 F .ORG $C056    ;跳转到PPU重写程序
$ p9 }# K( V1 M8 P JSR $7000
1 y9 [3 T* Y* d8 B! M  H3 z7 t! r. H0 \& A9 P9 S
.ORG $CEBF
! k( }6 o6 P: ?7 a$ e$ p( ^ JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入) x7 Z* p7 `/ l3 @3 J% `: K! C' Z
  
: ?* z9 z& F# r, j4 w* T  .ORG $E460
9 Y! U; ?" K  t9 v4 P- q" V7 W  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
% p6 X# o) N9 L/ H; Q5 c  : f" |: j$ m5 J5 W8 ]0 Z
.ORG $71F0
0 ?- i3 Y$ G" ~$ @0 ~/ `STAGE_DATA_WRITE:" b% f8 a8 t) z: V& Z
  LDA $6010: @* M$ @3 Y: ]' b$ Q4 f7 \1 K
  STA $1E    ;关卡写入  J: J+ }3 b3 r+ ]  M* b5 n) U$ G
  LDA #$00
. ?, B' `; b0 \  RTS
; c& b7 \% k0 [ .ORG $71C0
4 s7 q$ _3 ~7 L4 mBULLET_DATA_WRITE:    ;副武器数据写入
6 S+ ?' @. d. ?% C. N CPX #$0E0 F- G6 j; W( _; n7 {+ ?6 b
BCS P2_BUL0 O  ?1 [' Y; |
P1_BUL:
2 ~) s8 i( H$ t  e; |1 e LDA $6004! c! n6 M) r7 @) ~- M9 Y
JSR $D7D0    ;P1副武器数据写入" p* r4 j: g7 F. r' N: O1 Q" f
RTS$ p1 c, R$ L) u5 g, G7 r
P2_BUL:/ w4 t2 H2 F- c& _/ q! d8 p
LDA $60053 t  Q, [) _3 `% m6 S2 @9 {# E* S
JSR $D7D0    ;P2副武器数据写入: w( j& c8 M3 v& o6 a8 Q0 Y" ]
RTS
, u! l) Q+ C: V$ g: }- m: j7 N. _, h6 S
8 _! A, `0 g* O( V, ~
.ORG $7000) ?3 D& L0 P4 Z6 [- Z
  ! W# X  c9 B1 I9 V1 V3 h
STY $4014    ;补上覆盖的精灵写入指令! I3 p2 L3 |9 f4 Y) D( C
PHA9 k* q) o4 a7 ~0 [
TXA( X0 }* c/ _, a8 n/ H5 T+ E
PHA* _! N3 h- N+ W' ~
TYA' f; D2 ]0 @) i4 I( [: j
PHA
5 \/ ~5 x. H# j+ Y: Y8 `  N LDA $0C3 i9 A$ S/ P9 Y, U9 E
CMP #$01    ;比较是否为标题画面
1 z8 ?; P9 Z7 A1 O# ] BEQ PPU_STAGE
, X4 P1 [, v8 g' b6 X% Z PLA
, `% F+ ~) o2 z6 b  S, d9 m TAY# L4 m5 S+ t: E6 s; [3 z
PLA
' D( ~1 E* s# V  h2 d" @. @ TAX5 h# W! [% v3 m9 H$ v& \
PLA# L  D* Y. g. c2 v0 y; ], U4 q
RTS
& e6 J" O; a" C- yPPU_STAGE:    ;STAGE显示程序1 ^5 W" d* G1 ^0 U; @8 }4 T
LDA PPU_ADDR_DATA
4 X& D  }; A. y  J STA $2006
( ~$ ?' [+ ~% O5 y1 F& p' t LDA PPU_ADDR_DATA+1* o! G+ \' A& W+ C
STA $2006    ;坐标设置
, I7 |" A- }; o( ^' r" ^/ G LDX #$00- P  t! Y7 B. u/ h# }
PPU_STAGE_WROTE:    ;写入STAGE字模4 i% F) T" R  j' W& P
LDA STAGE_DATA,X4 H3 X: t0 e+ P
STA $2007
* J- G( U2 ~; B9 b INX
$ Q1 h/ W( Y+ }8 c CPX #$06" P5 |+ t6 j# c1 S
BCC PPU_STAGE_WROTE
% W$ H2 n3 @" N$ O# S7 S LDA $60104 K0 _4 i4 a* [3 k6 L7 j' l
CMP #$FF    ;关卡数据初始化条件判断' s. R4 _6 r$ [6 k4 o9 p5 o
BNE KEY_B
' s9 F% K/ ]1 v) M8 B' k2 e LDA #$003 m; _' y( R! e* d5 Q+ o
STA $6010    ;关卡数据初始化. R; G! G5 Q" S( b. N6 y3 B, O  A! g  V
KEY_B:    ;关卡减少
% Q  U9 O5 S7 Y. T8 z9 q+ Y. c LDA $04
" {5 A" A% k2 `: o' e# x AND #$42    ;按键B或左减关' a4 L$ d! k* A' J+ o. ]
BEQ KEY_A
  O/ y6 s+ X' S+ B  y LDA $6010" M+ B5 r3 P' O$ O9 E, k! @$ D- B
CMP #$00    ;关卡比较
2 N9 h4 z7 x2 U: E& j: X! M BEQ KEY_A
: }% X7 B# N) G, ^/ w DEC $6010   ;减关
+ q. x) i% X( G! d1 ^6 M" {KEY_A:    ;关卡增加: ?/ a" t% q+ \. T
LDA $04/ n6 H, Q9 B* ]6 E, A
AND #$81    ;按键A或右加关
- S" i2 H/ x" Z% C5 S BEQ PPU_NUM_WRITE
; B) K+ Z: W4 Y, V& N: k8 K* u LDA $6010! |9 g1 W  ?' _5 Z+ d* l
CMP #$04    ;关卡比较5 z  K) v1 k: e# _0 b; l
BEQ PPU_NUM_WRITE
3 e' ~9 t0 J& K( e4 t INC $6010    ;加关; ?2 K) n# R2 [# c$ @
PPU_NUM_WRITE:
  s  L8 z6 q! T+ I+ c' G7 y3 Z LDA $6010- P3 t% p2 n# e+ Q+ w4 E; |
TAX. a9 `3 Y- @0 ~5 @0 }  y
LDA STAGE_NUM,X    ;写入数字
5 W" V3 w, L+ B STA $20079 w; @% h" c/ B
PPU_RTS:6 p; a6 P9 z& ^8 J7 m8 j+ O( D
PLA3 F0 y" g) F8 m6 a" E
TAY: L2 ^1 k: A; p7 S1 ?6 d" q# d
PLA) F* \/ K8 X- ?3 Q* E$ Y$ E4 H
TAX7 S2 [, K) N/ [& W, G' Z# Z% C
PLA
8 A% Z" n6 k' Z( S1 W RTS
$ {0 B) F8 a$ }' `) @ - p- g# Z' `/ _
1 W, {6 w+ c/ g0 ^6 m: R
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据
' s2 _8 k2 ~: @9 y5 r& g: K4 T2 U- F .BYTE $EC,$ED,$DA,$E0,$DE,00
* j" I6 C) l( {7 V9 u9 c: `' fSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据& ?. J7 W* v; E0 Z, M% n" z
.BYTE $D1,$D2,$D3,$D4,$D5; {  C1 ~# |& h

- {& [; u# Y; C) |! E" Z0 ]PPU_ADDR_DATA:0 B; ^3 s  \' x+ W* o) I
.BYTE $23,$0C4 H8 O/ e& m8 s+ i1 |* v. p
% ~' s6 j6 B1 k$ ~9 J; s4 c' j7 g: d. p

本帖子中包含更多资源

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

×

签到天数: 179 天

[LV.7]常住居民III

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-6 21:36

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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