设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
7 Z8 p* n) t5 D1 R7 j2 e( t* c5 w
' i1 u! \) M/ y. s/ ?# x得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
6 u3 `7 `% p& h然而,今天想到一个思路.
& }# ~. Q& K) o( b1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
- p. \. u! y) E" c2 V6 D4 C2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
7 W0 N( H/ d3 w0 w) s# g3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).; G% a' F. E2 h: g1 B

# j5 U( L$ Y' m- |4 N0 J8 y4 {4 `8 C/ v! ^" X# L/ x. I4 O
;[FC][最终任务KEY][END]
6 ]* B% }( F! I( z$ [7 l6 Bbutton = $04    ;单次按键
3 ]; l. P' f6 w. kflag = $6000    ;功能开关标志
) r8 B/ T9 o7 u7 w2 |pause = $000E   ;暂停地址  G6 D. [5 m4 V2 Q( j; i4 ~
$ k% d9 W0 g. L: @( R, a
.ORG $8000. ~, l/ \) v7 T" h" d
LDY #$08    ;自带的按键程序7 c3 K+ C- c% |' e( [% m: |. C7 A  b
ADDR8002:8 Q2 z; j  u6 j% @: N2 m
LDA $4016,X3 b5 k! E0 D- N7 g6 E
LSR
" t2 H8 h4 [6 R7 @$ J- L& _ ROL $0021  S4 H# N  B/ W9 f. k
LSR* u  W' d9 o- @. V5 s+ y
ROL $0029
. ?- ?8 b+ @, i, w+ ]6 I DEY2 _8 _- _+ M& H2 ]$ F: V
BNE $8002
0 r  E  y8 M& x' I2 R; N" v% w2 S LDA $0021  x3 I! u1 B3 ]
ORA $0029
, Y: @  G$ z# J  r0 b STA $0021
' |" ^  i4 G" ^9 `7 p7 h) h LDA $0020
* n9 S6 N: R% ?7 {  V4 Q AND $00213 X% ~$ A) W- r' z
STA $0020
6 j1 P" j- i' d) R0 ^, t+ a' B LDA $06,X
% A9 m3 X9 Q) v5 Q$ z2 _& ? EOR $0020
" E$ ^: }  U& a1 ^9 @/ l2 ] AND $00206 o1 F6 l# b4 ?$ g
STA $04,X8 d! |' ~- H2 p/ ?& N
LDA $0020
- K$ S+ `! n. K. E$ R8 A' C STA $06,X2 c5 T9 ?1 p6 _+ X3 H. a) N
JSR KEY_OPERATE
5 p! L+ F5 K; T1 N" c" L8 ~4 Q# O JSR Function    ;功能调用
; Y; i5 G$ {9 U! f! q8 ]( k/ @ JSR Weapon    ;武器切换调用$ Y5 W  Z+ K& N# n! q
JSR Power    ;威力调用* Z$ w* N0 P# W8 E) ?( I& Z
JSR BULLET_NUM    ;子弹数目( ?0 X( @; M- s5 q/ x3 d! O1 F
JSR BULLET    ;副武器类型
$ q" P( Y9 t3 t, h RTS
9 X, Q' _0 P! w* O 0 D9 P3 h9 {' S4 U/ r  c
: M5 y. e  {  W7 J2 h9 ^3 t

& `* R4 I: l7 ]3 E. ? .ORG $8050
0 N8 z" @% Y+ W* h; d6 rFunction:    ;功能
3 _& w" v, S( ?. S( i1 A2 \7 K, EWUDI:    ;无敌4 I4 v% `4 `+ ^
LDA $6000,X" W- W. s& v. a! h6 ]! }
AND #$08    ;开关判断6 V; p: E7 F$ R8 c" [& p
BEQ LIFE2 F5 M- i, M5 l' j+ f0 ?" I+ f
LDA #$05( `6 i; V; {! n
STA $05DC,X    ;无敌锁定' F5 r) h3 Y9 W8 e: {1 n0 Z
LIFE:    ;生命
" t$ t: w  p% ] LDA $6000,X  X; F2 f0 I3 D; D; \! j
AND #$04    ;开关判断0 C* u2 T; G9 ]) x# u  I4 r3 Z
BEQ FUNRTS
$ h2 B. X# m6 m1 f9 J LDA #$05) f/ A" ~% }7 o$ R2 s1 H
STA $1C,X    ;生命赋值
. g. x  Z. T3 j0 mFUNRTS:
+ ?# a+ f# u7 q* {$ | RTS/ x1 B: A  e4 b

& ~5 g7 ~: [! ?Weapon:    ;武器切换
  P- n. J  c5 M  F) |8 u LDA pause    ;暂停状态判断
1 n1 r' o4 P1 R6 a BNE WEARTS/ B% M, G8 O0 E/ u6 i9 O
LDA $04,X
$ v! p: I1 j5 }' @3 v) p CMP #$20    ;选择键判断, J- a# S, {: m7 V6 o
BNE WEARTS  @+ d; ]: _- }
LDA $12,X0 y8 J$ y# K% q% O$ @
CMP #$03    ;武器值判断; V; s" M$ j" C2 y
BCC WEAINC" f9 q: \2 L4 P  V) X2 p/ L6 Q
LDA #$FF, N7 ^! N/ H, H5 D8 b
STA $12,X    ;武器重置
+ J) r+ T9 C9 F& t/ |WEAINC:% v+ _) d8 G6 L
INC $12,X    ;武器增加6 H' `+ M/ x) V0 f
+ g# I& ~/ i0 l0 f* y
WEARTS:
: o# F' a  Q& |7 C RTS
6 f! \7 v7 B, b2 q3 @6 I ! x; Z( A( v8 L+ y0 x5 s/ }
Power:    ;威力! a, P. B: U' ~( }' z
LDA pause    ;暂停状态判断
* u+ i$ T- r& n) E0 c/ v/ x BEQ SPERTS
( v% r% n6 J  Q/ j) n; N) rBUT_LEFT:5 T% [& a" o! a$ y/ }2 E2 n9 b
LDA $04,X& H/ L, U+ q8 ]  M+ o+ ^
CMP #$02    ;左按键判断
. j" S: ^8 m1 u BNE BUT_RIGHT
. }; T$ i) Q5 [3 i: j/ @( h LDA $88,X
" M) f7 r% `# x; B: `# O+ }2 Z- p. [ CMP #$00    ;威力判断9 p: s, l& i- j8 \. B
BEQ SPERTS/ b/ Z& l5 o& ?, j2 q  ~
SPEDEC
& }2 {9 \* M% I, Q* @6 X2 _) } LDA $88,X    ;读取武器值3 I1 X5 C+ i# x
SEC
3 f" W5 r5 [3 { SBC #$08! E; j5 M- x  m2 k: Q' Z
STA $88,X    ;威力减小
" K8 o5 N3 Z0 F3 f: `BUT_RIGHT:  ?- J% s6 ?2 E( D; D4 B8 k1 U& _
LDA $04,X9 X4 T( P2 f& ]+ W2 m$ j
CMP #$01    ;右按键判断+ \* ?8 J0 x: Y1 ?# C
BNE SPERTS* O# R2 Y6 m+ T/ Z+ E; j
LDA $88,X
6 ?' K9 Y  {- R6 h$ M0 S CMP #$10    ;威力判断/ N  G4 c1 Y; `. i+ k" N3 Y
BEQ SPERTS; s; ?4 w. f/ s1 l" A
SPEINC:, w: ^( r: Q  E) j' _- q- N/ G
LDA $88,X    ;读取武器值  I; A7 i% n- r' y
CLC- K4 k) L* r0 d2 `0 \2 ~
ADC #$08% |7 C* c/ Q9 C; M: w# h
STA $88,X    ;威力增大+ U! Q$ v: [- l$ l/ M' _

) t. b" u$ |' f( [& @4 K' ?SPERTS:
3 w; I5 X9 l& h RTS
# d& {% b  N0 n( I7 l6 g$ T1 \6 C. F1 \" W( |6 R
BULLET_NUM:    ;子弹数目/ f! I8 L: o* A' x6 o
LDA pause    ;暂停状态判断
( r: e" B7 p; H6 g4 w BEQ BULRTS  p$ H" d2 @5 t
CPX #$00    ;主机玩家判断
+ N0 d( j, H/ s! L/ ? BNE BULRTS
8 J3 B& Z$ h( O# \# D- ?  c; u LDA $04,X    ;主机玩家判断
+ `/ W) u- N+ S0 }# C AND #$80    ;按键A比较; P1 G% E# ?$ b3 d. i5 C! a
BEQ BULRTS
9 k  V" X% B$ {+ h" [ LDA $87    ;状态判断6 X' C- a, L- \$ P
BEQ BUL_2# G% z( o* N( G
BUL_1:
$ q+ U9 c: h* L1 n1 W& G: y. ?5 Z" }! p LDA #$005 a5 v. x+ p* l: A  N# c% B. }7 [
STA $87    ;1发子弹# w; ^: j6 ^4 Q: {5 b! v, q
BEQ BULRTS+ r- }6 P% f) |& d7 ]
BUL_2:
* w* y2 A* h2 \; V% f9 i  z LDA #$015 Y3 y- j! U" k4 `  q, v. Q
STA $87    ;2发子弹  [: `) V. [4 }! J

) a) _* t7 s4 j* T5 m7 n' S& iBULRTS:4 F+ c  z" ?8 p( z7 H- F% j* m, Y) H/ a
RTS
* a8 ?; ]+ d4 [, Q9 I ; N* w# z' K% n1 Y1 I5 F
2 o& C) x5 O2 d# ~; J; h* j) l2 A5 s; T
BULLET:$ w, |7 ?7 |0 M( g& p
LDA pause    ;判断暂停状态+ f- a7 I( W; o( X3 a+ p0 M4 S* Z
BEQ BULLETRTS
  }( |" G, r) o) c2 r) b* L LDA $04,X' m! j2 P3 K7 a4 @9 I4 D" H
CMP #$40    ;按键B比较
8 G8 T# i8 i- ?% d  I BNE BULLETRTS% q. t' x1 M; ~1 j
LDA $6002,X    ;读取副武器
! o" N+ u' F: e1 `5 g CMP #$03. u( J% |( I' A7 B2 J1 M! j
BCC BULLETADD( u* ~% N& Z  v. g, K3 ]
LDA #$FF* H( c/ K. V3 z* ^6 A4 V- x
STA $6002,X
' X5 u- E. f, h$ o7 j4 iBULLETADD:4 c& ~! X2 W, T! I' J# m* s
INC $6002,X4 {; z" n& P! e) N) g. X8 h
) D! M8 ~, U" O% N2 Q' \; p! V
BULLETRTS:* \5 Z5 r) M0 @+ b# _2 A
LDA $6002,X
3 R4 c; e9 V. P: F: L TAY7 e9 j) G. `$ I% U6 D; V
LDA BULLET_DATA,Y
9 X1 ]! P: _9 b, U8 d2 u7 i8 ~$ R STA $6004,X    ;写入副武器数据. ]3 J  @4 W7 {
RTS
) \% f, Q% ^! d
4 }0 e% T1 v6 J9 ], p  Z ; W/ c& U0 o0 L5 Q
BULLET_DATA:4 l* b- h; m$ t! e4 y
.BYTE $06,$02,$03,$04
; X5 f- X" k6 ?4 s) m ' X' F0 G9 Q, ^6 U
, ^4 {+ q* G, L& M" t) I

. L9 w0 }! O5 E! q$ Y7 o5 R, @$ c4 W8 LKEY_OPERATE:    ;按键开关操作
, q; ~8 J- E5 k1 v' J3 O  udata_protect:    ;数据保护, A) a9 M/ l+ \4 Z" |' ?' n3 c
PHA) _, |1 P9 X- g. O9 K
TXA
/ }7 u9 d# {$ T, U+ k; D PHA
# [0 k$ n' s0 C TYA
/ j6 Q! P8 r) Z- M$ z9 x( [' K# [0 q+ N PHA
  r* T6 A( J, _0 \4 v
2 D2 w" d5 O- [6 g6 jFLAG_INI:    ;开关标志初始化7 s8 _9 f+ E' I
7 d, L6 K/ W) ?$ h; Q0 }6 i
LDA $600F% @. w, W; b1 ~5 [& H) r
CMP #$01: [1 h$ j( \7 E6 u3 X" }: q
BEQ pause_cmp
% ]' t" ?) ]% B+ f* F LDA #$00
, a6 b& A- j: n: R3 M+ _5 q STA $6000; k: G+ Y3 P$ Y: t# u: ?- x8 k! t
STA $6001
+ Y0 p( M8 b2 _4 M STA $60023 d( L4 n6 B. I& x$ v% m
STA $6003
% J8 g& V% Q- B STA $6004  s! }* b6 b* M8 h1 l9 V
STA $6005
! W) `$ [, X$ V8 J LDA #$01+ q' Q% \6 T- L7 w" t( _
STA $600F
. }4 A4 P3 F$ x! i$ b 2 U' [5 n4 o2 a0 n- O- _. M
pause_cmp:    ;判断暂停状态
( o4 v& X: s! z5 h/ I LDA pause
& g; z; ]% ?3 v5 }% A6 z CMP #$01    ;判断暂停状态
$ J5 o2 H# \: ?# m- K" ~ BEQ button_press& S) x' v0 W0 g+ ^
PLA
' s! d* Y' p, b" F9 w# m, m, K TAY5 L& ~2 X% v0 |5 A2 m. a: n
PLA, M5 P& P4 r& e
TAX
+ d/ g: ?3 \9 X: e% E0 p& T PLA  o7 [1 |3 y5 E/ w0 e0 R0 t
RTS
- y7 l8 D( W4 u2 W) j' y
1 u& ~! t* g! J1 Z( U+ j. q4 Ybutton_press:    ;按压操作3 W# b' A, \# a* j& j
ini_Y:
. z3 m0 L8 {. m2 J. d- p9 i LDY #$00
7 Y0 Y2 @) T7 n! g1 K9 o" l# X: kbutton_cmp:) N, A5 ^% l. s. }5 Q
LDA button,X  D. ?) }1 n5 P& L/ [* U- ]' K6 V7 z
CMP ora_data,Y
1 j3 |$ i4 I$ g, ~ BNE count_Y_cmp; @# q! y/ ~+ u% Q# L1 |
flag_cmp:
, x8 u  V; W5 i3 v/ Z( F1 B( { LDA flag,X& M; r, p0 W: c0 A; s/ v$ l
AND ora_data,Y
0 o. @: F4 P" C: G# a( Y  p/ y3 Z! G BNE flag_and
1 P0 K# W# R5 @, c: }8 z1 @flag_ora:. w! ^, {+ m1 {  U
LDA flag,X: v: f! V6 z  G
ORA ora_data,Y
2 l0 W8 m, a( O) e& j STA flag,X& A$ e% B( M$ ]1 y6 o
BNE count_Y_cmp; Q0 d" K+ P/ L; Y8 [
flag_and:, M3 P( N( J3 j
LDA flag,X2 U& i2 J% Q, r: ^$ S
AND and_data,Y( z  }7 I9 s) a5 q1 ?
STA flag,X" e1 R4 Q1 q. _" `7 E. x5 j
count_Y_cmp:0 X/ Z# C2 n  a7 Q
INY4 T' e9 w0 G3 B
CPY #$08! u0 j0 F, ~0 `3 N# v, R
BCC button_cmp! S) \  t. G! x" ?

0 G3 F9 W* a- R  x2 f2 kdata_extract:    ;数据恢复
! {, a* N5 P) C+ }2 t  R) c0 ? PLA
9 ^7 X- D+ v( f TAY
! L. Y; s9 |. Q* q PLA
. p* |5 k" S; C! p8 F. { TAX+ x' b8 X* [3 R* u
PLA8 N9 N. @2 h/ G) I$ }& K1 e
, l. M5 ]. Z7 Y0 W, O8 h
return:
: @6 z( u, U+ E9 Q* U8 ]( X5 T RTS
8 f2 t! Y$ ^3 } 5 U5 ?9 C9 V$ f8 ]5 |; D/ l
ora_data:   ;按键相或数据! u+ O: U9 z& \- J
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
" j, v3 ?! G9 _, [" sand_data:   ;按键相与数据
8 H* v, K  C  B& v: h .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
& ]0 U4 L( ]; f" C( v4 Q  e; T1 ^
7 L5 ^! i0 O( E4 o# n- w6 t , l# T2 b; {+ n5 v; e/ f6 A2 L

# m/ f( b1 A/ p6 r ;FC数据搬移程序 BY FlameCyclone  S! p8 N. D' V4 l  L( g/ p
.ORG $8200
4 d. u# S' f3 D# @ JMP DATA_COPY_PROTECT
: q5 b7 c( j) A, ]  g4 ~( H0 y" G; z$ U
ADDR_DATA_TO = $40    ;目的地址3 A5 g9 N  F. q  R' C; |  F3 y% \
ADDR_FROM_START = $42    ;源开始地址
  p$ K* L1 k/ X' x- I5 e5 p* t. }ADDR_FROM_END = $44    ;源结束地址3 I# y7 D& \. x$ j. V5 g* X0 ~/ t

/ W& ?# G. y# DADDR_TO:    ;目的地址! H& q9 ^# S6 n6 w# A* j3 o- k
.BYTE $00,$707 o6 S" g4 p0 U
ADDR_BEGIN:    ;源开始地址5 Z0 e0 \! n4 X6 [9 O' }
.BYTE $00,$83
( U1 A% J$ x, {+ v- MADDR_END:    ;源结束地址
7 M1 L$ h7 e$ M( L .BYTE $FE,$84* g: K) F) w- e2 X

2 A" z1 V* H/ K% ?1 w; ]INT_ADDR = $08    ;中断地址
1 p5 E' o$ u  Y; U! mFLAG_OVER = $71FF    ;完成标志( g7 I2 w: f' Z6 H7 M
5 f- `* W* X- r; e, I! d. z& {# n

( q* M4 T( B) p1 ADATA_COPY_PROTECT:    ;保护数据
3 d. l. \# N5 U1 x* U PHP
% S  d3 S& l) W% N& Q PHA
- I# y% Y- p3 _8 r! |- s, O TXA) _$ c# v% J- ?5 T  V& N. ~, J4 u
PHA* x5 R7 W* J2 F' j# B
TYA
. n& R- g3 m) c: h& x, K. o' u. } PHA2 J* A* z7 r! o' D1 H, X
LDA ADDR_DATA_TO$ a0 W6 r& Z( T: S6 y$ T
PHA
" a& c* r# T6 j8 V( ? LDA ADDR_DATA_TO+1
& V$ k# x$ s3 P& p( P2 t2 j  Z PHA
1 c  u! b/ J( j LDA ADDR_FROM_START
: _# N1 b* p2 s% g( m9 m- P PHA/ I" o( k& P1 s4 d5 p
LDA ADDR_FROM_START+1
: c7 W$ k7 {: @6 I# c/ i' Y" F PHA7 l" v5 u/ \: r, J
LDA ADDR_FROM_END- d+ f+ q! M2 Y& \& c
PHA
' x8 ^+ K3 s0 c( F6 G/ U, u LDA ADDR_FROM_END+1
. `1 ^: t* B; @4 v0 m7 s# z' u0 L PHA6 B9 x* y! q! R6 ]5 ~; m  [* P8 h
+ `" [* h2 d: H7 ^
OFF_INT:   ;屏蔽中断
0 D( O+ R# c" b5 V+ r LDA INT_ADDR  S2 c6 n0 h- Q* t7 P2 m
AND #$7F! |1 `1 g# b0 s0 e
STA $2000    ;屏蔽中断
& l9 @1 B) t  M' M) S2 i2 h" F4 [  V$ e9 j
8 J$ e1 C8 c* Q6 q8 x
SET_DATA_ADDR_START:    ;设置复制起始地址
$ I: g0 y% z: v5 }" d LDA ADDR_BEGIN
. i3 r1 P: x- \: ? STA ADDR_FROM_START    ;设置复制起始地址低位
8 @6 K) R( d' F6 j- d! g  ^) u) V. D LDA ADDR_BEGIN+1! X. {& P4 E4 Y' h2 E$ \% a
STA ADDR_FROM_START+1    ;设置复制起始地址高位
8 P$ O+ T% j2 d% |
2 S, Y8 z1 J4 E+ ]* c0 |4 `SET_DATA_ADDR_END:    ;设置复制结束地址
) y% ]1 x$ U8 K- |' L/ O/ [4 b$ H' a LDA ADDR_END
& ?+ P( B: G2 h6 j STA ADDR_FROM_END    ;设置复制结束地址低位, N0 f- o, ^& K! P: N
LDA ADDR_END+13 Z& ]. N" A: d7 o
STA ADDR_FROM_END+1    ;设置复制结束地址高位
; W8 X: f+ z0 o/ Y7 i' C ( N4 D- c7 E0 |* |4 ]8 H9 n
SET_DATA_COPY_START:   ;设置目的起始地址
2 o' Z4 X* z$ W LDA ADDR_TO
/ v5 s( r) q" ^* G' h STA ADDR_DATA_TO   ;设置目的起始地址低位
: N3 I; `# V. s7 M! z. e. I. V  I LDA ADDR_TO+1
' O  R* j- I  R& f; v. d7 s STA ADDR_DATA_TO+1   ;设置目的起始地址高位9 s2 J+ F- x+ P/ {
$ g7 g8 H  W7 o' V5 M
OVER_COPY_CMP:    ;复制完成比较% ~' j9 [5 e7 T  V
LDA FLAG_OVER
& A. i- c- r% F  d CMP #$FE    ;复制完成标志比较. D- ]" H# [- h
BEQ DATA_COPY_EXACT
' X9 j4 q' r& [& b! Q' p) J5 t8 a( \: N4 V( L- _
INI_XY_COUNT:   ;计数器初始化& J- d4 b/ v$ x. p- l' A
LDX #$00
, Y) o; G: E" q0 o. V LDY #$00
1 B" ?/ O! o- ?0 g6 p) s  w, M( N4 U / |3 r3 f% }' B  S5 p$ {+ ]
COPY_OVER_CMP:    ;地址比较& k9 C& h$ x& G6 s: W
LDA ADDR_FROM_START
* g8 O' t. \; `( n; l8 C CMP ADDR_FROM_END2 z; A3 u) {& s6 G7 B3 k8 A0 _* o! Q+ y
BNE COPY_START) w4 a4 S# r$ |6 J/ Q4 S6 d/ M* i  U
LDA ADDR_FROM_START+1& y- h8 C3 w# ?+ g0 [% d( g# j' d
CMP ADDR_FROM_END+13 q& w5 ~/ ]8 D8 D. c6 G
BEQ COPY_OVER5 ]" A5 k# H& ]" o, A% Y3 P4 t; r

) H; g) t" H7 {6 ]8 RCOPY_START:    ;数据复制开始" B  o) O7 w4 O
LDA (ADDR_FROM_START),Y    ;读取源地址* f' w6 H6 @  o3 ~: G/ D7 h
STA (ADDR_DATA_TO),Y    ;写入目的地址8 X) W! Y  T+ Y( T
INC ADDR_FROM_START   ;源地址低位递增
* n+ _' g* m( [' @8 H0 H; a INC ADDR_DATA_TO   ;目的地址低位递增, ~% a3 v5 |9 ?
BNE COPY_JMP
! y8 p7 ~# T# u5 p3 D  c) m INC ADDR_FROM_START+1   ;源地址高位递增
4 \% Y. F. A  i# a  n INC ADDR_DATA_TO+1   ;目的地址高位递增0 n) S" W3 C) ]( |

: D* A+ H; f/ uCOPY_JMP:    6 d. h; Q4 g" D0 g. T( n3 ^' t% E
JMP COPY_OVER_CMP7 E3 h1 l+ `4 t6 q. W! {+ P

2 y# z$ S5 w# o- \1 ^6 [. N. UCOPY_OVER:    ;复制完成
3 Q# ]& u1 n8 P. G& T+ I, }  ] LDA #$FE5 X3 @9 g9 F) [; V& ~1 r& ^
STA FLAG_OVER    ;写入完成标志
" \, ]: o* |2 Q% ~8 }2 jFINAL_BYTE:
# |' x  Q9 a! ~# S* n' } LDA (ADDR_FROM_START),Y    ;读取最后一个字节7 g' ]$ i) Y6 c- g1 m9 k2 t5 |
STA (ADDR_DATA_TO),Y    ;写入最后一个字节
+ q) ^! D! h6 a' }4 }; H
; W  {4 x# ]4 z& H6 w/ h  H2 q- CDATA_COPY_EXACT:    ;恢复数据8 g) x# W7 R, \/ `7 l5 }
LDA INT_ADDR5 U% _/ C1 N1 M/ Y
STA $2000    ;恢复中断
) i- T2 r2 D, L  r0 H PLA
9 r- C6 d: ]% X( w STA ADDR_FROM_END+1
3 i; C( |* m. l) }0 m PLA! v; X. H' c8 Q; s! u" q
STA ADDR_FROM_END2 r& g$ i# x0 K+ d/ }; B! {
PLA/ K  @8 B4 S: n
STA ADDR_FROM_START+18 ?6 K# L0 q9 X7 P  u; V
PLA9 X1 g( N# O  f, [8 O: G7 @0 a
STA ADDR_FROM_START# T% V0 u4 @+ o" J3 O$ L
PLA- Y' g1 X4 V5 o/ r
STA ADDR_DATA_TO+11 E! q* k5 ]- P$ u$ G4 Z
PLA
+ W  E, d# g+ p4 v9 u  L STA ADDR_DATA_TO
# J( _# U0 w; ^# g) c7 q PLA
, T' r; h+ Z: J! I TAY1 @8 h* `5 }. j* q. O
PLA
5 r: Z) K5 m( q" u/ Q8 | TAX) z$ n: [+ P' Z5 r2 b
PLA
9 B2 h4 A3 n9 r! ]/ q) m) L PLP
1 h( G$ w+ o  C1 i& W
" F# n, w! x! A* C& T: Q4 D( G5 A6 M
& L0 V- ?/ j1 J" \ ) G5 L6 E+ O: A. L
DATA_COPY_RETURN:
) j6 x2 Y3 M! p- k" l RTS5 v4 H% k9 H; e* u

, Q( G  ^$ O7 ?; ~# U( h# [ .ORG $C056    ;精灵指令覆盖
( [- \! |0 ]" G3 C$ m/ q JSR $FFB5
1 f7 M! J0 `0 R3 w- C  Q
' C% L" Z: \# { .ORG $FFB5    ;
% S) ^8 V) ^" z/ I3 v9 b) i7 K2 W PHA/ N6 u; t4 Z7 B+ Z( g; `6 E
  TXA
+ ^! A) B) l8 y% o PHA
* D7 ~' O- |$ _1 s$ L$ P TYA
3 H" y; I: f. a1 f3 B PHA9 ^6 d) R: S$ I* H/ ]
LDA $71FF    ;比较7000-71FE数据是否完成复制4 E  a( H$ M! i: }+ S
CMP #$FE7 a/ ~% |& X; v' z! E8 Y2 c; l
BNE ADDR_FFCA
8 S4 s+ K+ L& C4 J4 h, u- u PLA
+ O0 _" }- N8 R& `& ] TAY
/ X2 i8 Y+ j- {0 I9 D PLA
- @; P5 a4 a& b/ B TAX  t5 x0 Y5 S0 w, I+ m6 S
PLA
& J" F) U; y( m- u2 } JSR $7000   ;跳转到自写程序4 j) n7 u4 c5 R. L9 ]0 H2 l
RTS$ x& }2 Q, |# O2 t
ADDR_FFCA:
- e: Q& z) i3 Y- B PLA0 b1 J: b5 ^$ @- }
TAY
, w* k/ l0 {- R PLA( G( ~( d/ B  c( Y# I2 X( o
TAX9 z7 a. f$ k: K; R# X: k. ^
PLA* Q8 n7 O- d' w, \$ {' I: ~+ X* C
RTS
/ D/ {7 O5 {  z0 |6 h1 r
5 V( S; m, B3 w1 N
+ h: W: m' D0 N( `2 M+ B) W
& E: G" @$ _) @2 H* C4 m .ORG $C264    ;自定义的MAPPER2切页程序6 e3 I# s2 {" F' Y6 L
PHA
4 u1 x8 e6 ~0 x' J% ~ TXA
) u9 u1 t  ]5 L5 z. G9 @- ^. e PHA1 m: T9 H& E' P# v0 f; x" V: ^
LDA $00669 U5 h# |  h, k9 V+ o
BNE ADDRC280
; R3 B: D4 ^; |" {7 E3 W LDA #$074 p# [, H/ N5 b, F9 q1 a& [
LDX #$03: a" O: R# g$ h9 h* H0 W+ ~
JSR $CD9B    ;自带的切bank方法
0 S' |3 d- F3 h5 a) o9 g8 O PLA9 H: _  ^) [, x. i+ P9 m4 k
TAX
* `. F! b& L6 ^" n- w0 L PLA
, w! h7 w3 o/ t' Q JSR $8000' Y! }+ A/ Q% C  W5 O  z) M) I
LDA #$06
8 J' e  _9 W( r- s5 X( t1 f7 G" @ LDX #$03
/ L2 d8 Y* |' d& K) p7 h) L+ c JSR $CD9B    ;切回原该切得bank(可以不用)6 l. b# }  Q8 ?6 n
RTS, n5 c- N: @% i/ X. f, g
ADDRC280:
9 i0 i* k- ?" W) b: B PLA. M& j! n5 l  W& d  O
TAX( U# W. {( {% r& W8 E
PLA) O' V3 s( Q) \2 J( U
RTS# {* s5 {  Y! W% C  [% p2 @; c

, c3 `; E  u, r- ` " x1 O2 o4 p! B: N! h% @# B
;[FC][最终任务PPU][END], T0 v. [# |- p% X. u' a3 U' K8 _
.ORG $C056    ;跳转到PPU重写程序
2 `6 p7 M6 t  H% `2 a JSR $7000
8 A  r/ r! A! {  Q: H: G( Z' ^5 j; q; J) ]+ C  N2 S% {6 o$ f
.ORG $CEBF
  l: E* M# Y, `2 l0 D! n1 g  D JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入& r7 C2 X7 @$ L& F. H, k4 _
  3 K: f9 t1 A; I* p  Y
  .ORG $E460/ ]( ^% I( j1 T+ e+ m
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
2 W( z1 @/ O0 I$ @1 W- v  6 D& w- {. I- h% f) y" p* l
.ORG $71F0$ V* I; t) M, o. b, c
STAGE_DATA_WRITE:' v7 U/ a$ n' {" B& m- Z1 }3 m5 X% ]
  LDA $6010
1 u% X% s9 ]# p2 ~' Z( @  STA $1E    ;关卡写入, R4 g; s" P) u
  LDA #$00
. o8 D" w) M$ [+ z9 T& P8 \  RTS
' w7 D; ^0 q( v2 ?$ O5 h' S .ORG $71C0
1 U: l; l; X) s, W6 ?. c+ cBULLET_DATA_WRITE:    ;副武器数据写入
* m# v3 _( B# n. B2 |8 Q' s, ` CPX #$0E' Y" F0 c& b, W. j
BCS P2_BUL8 ?' h6 o5 e' m9 _: a! T  k* y
P1_BUL:
* ^' }" a1 i6 z6 u0 I2 J LDA $6004
% Q% [% Y% p+ M JSR $D7D0    ;P1副武器数据写入
% I$ g1 @2 C/ d5 ^3 c RTS8 P; a# _# e2 c& J" T
P2_BUL:+ B  E5 W2 `( V/ i( _! C/ [8 }8 j
LDA $6005
6 n# k9 g( t0 S0 R* E* U JSR $D7D0    ;P2副武器数据写入
! @8 p' N$ R7 P% z: E RTS$ r. O& r  ^0 u1 N, s" Y
5 ?- j6 F8 t- k1 J2 X
) r( F" S/ U; s: u& r
.ORG $70002 M0 j! R4 \/ O# }/ `
  
! N' t, c# g4 D  k$ p; q& { STY $4014    ;补上覆盖的精灵写入指令2 Z% u7 }+ d+ w* U8 W. |9 y
PHA; l$ s" K5 ~* z6 \% G# i- K
TXA
" j: V# c, C$ m PHA4 s/ E, L  r* |5 Y5 c. F' m. J
TYA
! @* u" f; V8 ? PHA
6 Z# \0 X/ |( W LDA $0C7 n3 V- T# s0 I) J9 q
CMP #$01    ;比较是否为标题画面6 ~( P6 N, h# y8 ?4 k2 \/ v. A
BEQ PPU_STAGE
0 [! _+ T0 z0 O! C PLA
7 F8 M- J6 Y) s+ A2 L TAY
  @* E( i+ `2 [" `( ` PLA
/ f) x1 F4 b1 O! ~! A& ?2 N TAX
9 K* j  L, M6 n PLA
! |" W  P' @& H- o8 N- V; k' Z RTS  g% k) r( M4 _* O0 V/ x0 H( F: {  J+ N
PPU_STAGE:    ;STAGE显示程序& V- I0 j! H0 w( i/ p
LDA PPU_ADDR_DATA' R5 ?. `( [  b3 e9 H  T) S
STA $20062 M/ {' `, h7 D. i* G
LDA PPU_ADDR_DATA+1
- O& x' Y. K, ~& D! c! U. W, [ STA $2006    ;坐标设置
3 F* N. e+ A8 t! k5 S- Z1 l LDX #$00
6 N- e* z# k, [' T* L5 ]$ n$ WPPU_STAGE_WROTE:    ;写入STAGE字模3 Z$ B, e# F) {3 p
LDA STAGE_DATA,X
  T- a6 p! `( n2 S  Z% D STA $2007
& C+ a$ q( o; Z+ @* Y0 h INX
$ u4 ?. z0 \! j! A! w CPX #$06: G1 T( m$ l& h
BCC PPU_STAGE_WROTE
* V- F6 B9 J- d1 F8 V/ s2 A9 X* @ LDA $6010( q( o0 N5 K, L' ^
CMP #$FF    ;关卡数据初始化条件判断
) ~; D/ G0 p- z6 Y, m BNE KEY_B+ ?6 g2 Q" i& N0 O9 ~
LDA #$00
, h4 \- c+ ~) v) P  a6 H. Q/ Z8 ? STA $6010    ;关卡数据初始化
+ \, H  n8 |4 w6 iKEY_B:    ;关卡减少
! `; l) e3 Y8 w  r6 F* g9 a  t  p LDA $04
5 l5 D. I" j% q. I) a7 v) n+ | AND #$42    ;按键B或左减关& S2 `- H' N7 ~0 o; Q; u& b* K6 u
BEQ KEY_A
) t: Y/ o% h+ u) r) p$ a; { LDA $6010. h7 P$ e- l. a3 |* N# K
CMP #$00    ;关卡比较  q& `* k; A; ~; n$ [9 b! h
BEQ KEY_A
3 w9 v; Z) d: u; V DEC $6010   ;减关
& V0 m) e5 ^) ~; J- HKEY_A:    ;关卡增加) g0 s% l6 `& I, T2 [0 ~) o
LDA $04
; D- A0 Y1 ?& _, Z9 C$ ^# E AND #$81    ;按键A或右加关
8 R0 A0 ?; E) ~) j+ C BEQ PPU_NUM_WRITE* U2 B0 X+ X4 I6 Q) |( ^9 `
LDA $6010
6 q/ v- p8 F+ t# n5 E' h& J CMP #$04    ;关卡比较" Y; o0 \: m/ @( r8 k
BEQ PPU_NUM_WRITE+ d3 ?& G3 J* z  t
INC $6010    ;加关
' z' j1 {; Y$ F2 ]2 r, |PPU_NUM_WRITE:3 i! S1 Q3 k, E6 E5 ]
LDA $6010
- u6 y2 m9 j) V* u7 H# W2 u+ d) O/ H TAX
7 t+ z! O- U8 E LDA STAGE_NUM,X    ;写入数字7 P4 j% l0 ~6 m3 P
STA $20079 u3 M+ w& {5 D- G0 h
PPU_RTS:
- Y5 V* i3 p: {4 m0 _3 Y  I. L1 F PLA
5 \: ~. t# ]3 L) B! A3 M6 j' S TAY
, T8 v; E* q9 x/ f PLA( C: l9 H  Y* X" {) c" s
TAX3 `! o/ R8 A; W; ]
PLA
, Y, e& O& G. q6 D3 f RTS9 m  g3 T0 d! I6 d7 j
4 E, a) J. D- \' ]* _# W+ [
2 L) [- \+ `7 a8 x$ y' h4 R( N
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据7 g& _4 b8 Y9 H$ I
.BYTE $EC,$ED,$DA,$E0,$DE,00
9 a. i! K* o% O0 g* TSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
: Y. W  l* i4 `9 f3 T .BYTE $D1,$D2,$D3,$D4,$D5
. X0 f  D4 R7 n3 }5 A ( I9 V% a! [4 U5 o. |; u- ]/ B
PPU_ADDR_DATA:4 A7 J6 Z8 V/ f/ r+ _3 ]* ^
.BYTE $23,$0C
1 L  X' O: T7 S% b6 Y
- q2 q9 Q; J) w0 o7 b' R

本帖子中包含更多资源

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

×

签到天数: 179 天

[LV.7]常住居民III

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-27 07:49

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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