EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 7 T' \0 H3 j: a6 V: o3 N$ U

3 A. m# o/ N$ |0 E3 O; q+ s9 s得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
4 b; z, F0 I! Q2 x* A然而,今天想到一个思路.+ m* A. C) O/ A( u! N
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.) B) [5 ^% h. y1 V; s
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
. F: I8 W$ L* p0 m5 a4 D  }3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
/ S1 h& C. u0 c4 W: v0 l
0 K. Y+ ?. n, @: D- g5 `( g. i
" U$ M9 u% q4 A9 ~- m0 ?+ B4 R; k;[FC][最终任务KEY][END]' s8 N( j8 c/ ]( ]; Y
button = $04    ;单次按键
2 c2 \+ E# Y, E) Hflag = $6000    ;功能开关标志
$ w* r0 q  {% {# I3 R! K8 Apause = $000E   ;暂停地址
. B5 ]3 p6 ^# y, r7 `# X
/ L/ t- Q/ N: B& Y. N .ORG $80004 ^+ `6 z" p( }; W8 Z7 l
LDY #$08    ;自带的按键程序
+ [+ |! d% W6 o$ ^4 hADDR8002:
9 l" Z6 C' z; q# ]5 X0 e LDA $4016,X
* I0 {" p/ P/ r; K. q/ v7 H# y$ x+ v LSR
1 m- f' g1 P- H+ \0 Y3 q" Q# w ROL $0021+ t% m/ ~4 J' T# i1 V& x) z
LSR
+ i& K% ~( o6 w& C6 t ROL $0029
- h4 q1 L, i6 m" L7 N3 u/ Y! i& A DEY
1 \3 O+ D( U) H& y* R$ R BNE $8002) w" @- G& q+ K7 W+ j
LDA $0021) e6 p: B/ k- w2 N  ~
ORA $0029( z* R4 Z  }7 Q& d2 L; K9 ]
STA $0021/ l, _6 k, l; {% q; M. ]7 T
LDA $0020* t( K; g4 X# `0 j0 @
AND $00219 c4 C( ]* Y" K5 J& i# l) t
STA $00208 o% k) l: D& n+ g7 b1 H1 g3 v
LDA $06,X
7 S8 s! e% W& K! H" E0 m( e EOR $00205 o6 _2 H" V/ l  Q' |# ]
AND $0020
+ t9 m* C6 M1 a& ]$ N STA $04,X
. v& B' x# U  r. \* g) V7 h, v1 U* l* H LDA $00209 e  q  V, Y& R: ^+ e
STA $06,X
( T0 s  Q  d% I& d+ } JSR KEY_OPERATE) u4 L6 S8 g8 w& D9 g! L3 c
JSR Function    ;功能调用' V9 n' t1 \& l( A9 r) ^+ E! J
JSR Weapon    ;武器切换调用
! A- V  F- X2 \. Z0 |/ H) k JSR Power    ;威力调用# i( v! W$ N5 D6 R% b) Z. ^7 M6 `
JSR BULLET_NUM    ;子弹数目
5 d* j; E) V+ b) O JSR BULLET    ;副武器类型, Y) ?3 L' t) z# ]
RTS
3 T* X, ]6 j$ { ) u7 b! }) s& A

- _3 z' D' t5 V- F4 T; G8 g; D; N+ p. z
.ORG $8050
$ L- U9 `6 i$ N3 m! p+ ^2 Z1 N+ dFunction:    ;功能: N4 U; J* N9 M/ h( e
WUDI:    ;无敌
7 j, B( Y( d, D/ k' M! a LDA $6000,X
6 ^% h6 ?* S3 {5 }0 \ AND #$08    ;开关判断
% P& ?8 [( ]$ K( H  D BEQ LIFE6 M3 X, ~9 H0 |+ j+ k+ c2 k
LDA #$05
1 ?9 W1 E# H% D- j5 o0 R5 z) }' T STA $05DC,X    ;无敌锁定" K; D9 g6 H" p) Q
LIFE:    ;生命  V6 u, {" g( p) r% g  p0 R2 Q
LDA $6000,X
; S+ _! c! r9 {  R# M AND #$04    ;开关判断
5 ~6 t$ \& x; ]( f BEQ FUNRTS# B5 l4 F5 q, G% G  C( D
LDA #$05
: [; n. s2 V6 ^$ z) ? STA $1C,X    ;生命赋值: ?# @3 ?& C6 O
FUNRTS:
; U' U/ f: n! W3 Z: {& U, M RTS
" f" Y. k- x- F
% X' w9 D7 Y6 ?1 ], BWeapon:    ;武器切换+ j1 B2 }( z% J
LDA pause    ;暂停状态判断
4 S( ]4 Q/ ^( w& j BNE WEARTS
# j0 }! r. ]. M LDA $04,X
4 V0 s0 @5 Z& q CMP #$20    ;选择键判断; R/ V" S$ M. ~4 K
BNE WEARTS
. y3 B+ V# l7 q% d5 x6 I8 P LDA $12,X3 P% `+ j/ M) ~+ \' J+ H
CMP #$03    ;武器值判断
% C/ O2 Q: W% ^. a" P& H8 @ BCC WEAINC' d: q$ g/ g" @* t# r6 p
LDA #$FF( o: m" \9 a: I
STA $12,X    ;武器重置
. c& W: x' I* AWEAINC:
" v* n5 U+ |. E; s+ @$ c7 j INC $12,X    ;武器增加/ y7 q5 D4 T& p& q
* L( A$ y9 E- t" G6 M" B
WEARTS:
9 |1 u/ T; y0 n RTS
. [1 \6 N/ C, t; L
$ Y8 q& Y: {5 T8 T) O: D0 IPower:    ;威力
0 I- x' W/ c% G LDA pause    ;暂停状态判断1 W# ^' ~5 g) _" D
BEQ SPERTS
; ~# m5 l9 r7 i9 T& ]BUT_LEFT:- }+ W8 ]0 }# r) Q3 Y
LDA $04,X  i. b& Y1 |" C+ I
CMP #$02    ;左按键判断4 J! _7 ]$ \5 A. V* R
BNE BUT_RIGHT9 K% S8 c) i* ]; x3 _) l) f
LDA $88,X) I, ], e( X& j/ u( ~, c2 z
CMP #$00    ;威力判断
4 t( `8 e4 r. ]' A$ n' l, d, D3 w BEQ SPERTS
1 i" G5 c/ N8 L6 A7 M* y4 v4 U) U9 _SPEDEC
8 s& |9 k! X2 M0 ?/ E) g- ]; B LDA $88,X    ;读取武器值! H! g+ G7 G* K2 a( [+ ^
SEC
" T7 }, S* d$ r  I: A SBC #$08' d8 G: W) F$ c( M" c4 c- J
STA $88,X    ;威力减小& s  D2 B: I2 P0 l7 M
BUT_RIGHT:% r! H$ A9 q3 ?( H
LDA $04,X
& a" j9 B3 G( K  t4 a9 K CMP #$01    ;右按键判断7 D% x- e0 F4 C5 O  D! O& k
BNE SPERTS! _4 u4 u3 K4 o( N/ g
LDA $88,X
& J5 ^) ?2 ~/ H: C1 m* V CMP #$10    ;威力判断. ~' D' L5 D0 s/ K0 K1 r
BEQ SPERTS
( P- N& h* l  o8 J8 WSPEINC:
8 @/ j+ K# h. o& X. D2 `9 c1 M: @) F( _ LDA $88,X    ;读取武器值
* O/ B: [  q2 M4 d7 ` CLC' ^; S" g0 c8 j3 m) M$ ^4 J# C
ADC #$085 @  i) L6 c3 p+ t2 J# {# S/ Z. E
STA $88,X    ;威力增大* e$ A5 J6 G+ \, X2 i! F- L* x0 V( w
; f) U' m  A3 b$ y# ^' F
SPERTS:
7 h. L, q. l9 P/ A' q" m RTS
6 M1 d" j- b3 k
9 n9 ^2 V* l' b' C8 _BULLET_NUM:    ;子弹数目+ r: P5 p7 K2 |' e/ j, s5 S8 P" |6 m
LDA pause    ;暂停状态判断& h! l8 d+ M* K; h6 q- i7 \
BEQ BULRTS% h6 Q" g. D- {2 Z/ W( u( Y
CPX #$00    ;主机玩家判断
6 D/ k/ V9 F( N: m BNE BULRTS
/ v3 {+ A9 V( r/ |+ P; k( K8 P" T& E LDA $04,X    ;主机玩家判断
6 ]' {) D. B, o& ? AND #$80    ;按键A比较1 ]% o  F, @/ L
BEQ BULRTS: a6 }2 E9 k$ _
LDA $87    ;状态判断, t4 e# n" g4 h3 q9 o% @
BEQ BUL_2* ?5 k# f* X2 k/ ]
BUL_1:( g9 b' G) U& s" E! }
LDA #$00
. S4 F3 d/ J1 P STA $87    ;1发子弹7 P8 m5 Z1 E1 P% E' M
BEQ BULRTS
( |2 X7 s) L5 @4 s- r9 q9 `BUL_2:
" T% L3 d9 s. J% [ LDA #$015 P; L) j9 [7 B( b  D
STA $87    ;2发子弹# {/ P: Q. Z, X6 j6 }+ ~
2 a0 w) F0 W' V7 V) p
BULRTS:
8 x* K# Q0 l0 F. u$ ~ RTS
  ]" H/ \1 r" h7 c
$ e) J& r, L; ]1 \4 Y1 F0 Y% X2 v
# p# C* l( M2 M! F; _BULLET:, l9 N% M! L3 T: w# S2 c0 x4 X
LDA pause    ;判断暂停状态7 U" q  e" v: t, z* n
BEQ BULLETRTS
* o" r( t- e  w1 Z( } LDA $04,X
* O- T' I1 b' e4 a1 e CMP #$40    ;按键B比较
/ q" ]& R$ W3 H/ Y BNE BULLETRTS6 I8 F7 Z0 G' Y0 q0 r; u
LDA $6002,X    ;读取副武器
' l7 c4 h) [) e5 | CMP #$03" p- O) P& S+ Z" k
BCC BULLETADD
% E3 n. f/ q) ` LDA #$FF9 h" `; ^! W6 V) ]& i
STA $6002,X6 p* |& Q# I4 }. ^4 s& N
BULLETADD:# O3 z) _4 V9 y2 x$ X8 s! E7 ]
INC $6002,X( j8 L- w  p8 \5 m+ R5 g' L- J

0 V" ^( t6 t' U6 \1 E1 i$ Z% UBULLETRTS:
  K+ G* {0 x6 j/ I; t) W LDA $6002,X* k9 Q# h& c3 e& ^: ~
TAY
( C  q" @+ K5 n: v) v2 N; L LDA BULLET_DATA,Y
  w8 P+ K, z( J STA $6004,X    ;写入副武器数据0 W* _$ ^8 M6 C: w4 o
RTS
  ]$ W: `- v- C3 l; c8 H% h: u. ~4 C 2 q# K7 }% ^- A' x! B) z" B

4 {& k. a$ H$ y% JBULLET_DATA:
/ i6 L$ [8 _7 M8 q: x .BYTE $06,$02,$03,$04
. D  u9 |5 `* U9 f- |: m# H3 F3 _- y0 d ' {- I4 y9 q7 }' H

. ]$ d3 w, V  l
6 Q4 q8 c6 K7 GKEY_OPERATE:    ;按键开关操作7 I/ j7 Z* G5 j, U
data_protect:    ;数据保护
6 `6 C4 c/ w; Z* B3 T7 p% }2 p, Z. l PHA; Z! ~* ~; u) y& ~) j
TXA
# u* q$ e  U# Q9 K, _0 I PHA: |2 T' O+ l' v- M0 e1 Q. Q
TYA
% `- E4 r( |2 X) n  n; V PHA# o6 @" Y9 Z' S* W* A2 k# i' R

$ x/ H2 s2 L/ qFLAG_INI:    ;开关标志初始化+ ^  ?1 j$ ~% E: w# ~% Y) N

0 I0 y% d% Z  U8 H0 y LDA $600F
& C. i, q3 S& G  k; S6 M4 q CMP #$01
( S' E  _  E4 v BEQ pause_cmp! m8 H- I+ O1 \3 `
LDA #$00: f7 K$ i) a9 K9 t: f2 q6 S$ n
STA $6000
$ d8 V6 P8 E* W. v STA $60013 Y) M3 s& e' F- y9 v+ _
STA $6002
' q$ n7 t2 A# _# I: E& W1 B+ Z( o; v( G STA $6003
7 r) ]1 U$ G) @7 T4 Y STA $6004
/ A! [# a, n* |; I; ?# V- p; u STA $6005
/ `$ u/ r+ K- U: Z LDA #$01
. t1 x3 e1 f% i STA $600F, x, C) b- \! e$ f! m" d8 g8 T
% I/ r9 Y+ s) ?0 ?, p6 h5 A
pause_cmp:    ;判断暂停状态
- L/ l$ ~2 r/ Q& h* a: R LDA pause
8 c+ W* Q8 L* E0 X3 o5 |( }+ l/ z CMP #$01    ;判断暂停状态
8 f1 d/ @# e. s8 d BEQ button_press0 I, \* \4 Y* t9 Q
PLA
3 k0 E% b+ a7 X( t TAY
  r9 x/ P( T, \+ `) S) i% L" F PLA
! D5 |2 ]) B$ D# X TAX& p; Q+ P! m) D; A
PLA4 S, _- i, R$ A' ?5 q
RTS
. ?9 |2 q! _/ q$ B/ j' ~
' j. ^1 [1 h/ fbutton_press:    ;按压操作
3 M; C- [6 P9 e+ t! H2 G( v0 Z+ Qini_Y:7 _) T/ |2 A+ J! {, W
LDY #$001 P0 p( A+ }- r# P. d6 D
button_cmp:, N) m3 m+ V* u* I* s5 R4 k
LDA button,X( P9 {3 b# D+ s/ \( \  E) ?
CMP ora_data,Y
2 p/ v1 O3 U* d2 E0 v BNE count_Y_cmp
) g8 G$ @+ t8 yflag_cmp:# j4 t& k' P& m) I0 r7 y" Z2 x
LDA flag,X6 {7 M0 {) R: v
AND ora_data,Y/ e0 D, v/ s8 s* {
BNE flag_and& w, Q( \% r  o5 N8 D) Q3 ]! n
flag_ora:
" h$ O2 G* H0 k9 r0 \ LDA flag,X8 W* b% m8 f0 v/ W$ z2 c. q
ORA ora_data,Y
) P2 s5 q6 x+ c  p' O STA flag,X
# u% A# V% T( R" u8 p BNE count_Y_cmp: g8 |: a: x, v; ]3 t+ b" h9 z7 w& ^
flag_and:9 S# b& A8 n7 T, @
LDA flag,X" u, c/ Y% }. I, t) R3 w
AND and_data,Y
2 H1 k( h; y$ F+ x STA flag,X
# `- `* ^# C: Y/ Ecount_Y_cmp:
. `7 f/ x* V' b INY$ S! W' y* d% n7 k! G; f1 p8 t7 {
CPY #$08! q5 }$ w( M% e  B/ B8 o
BCC button_cmp- q6 }8 J1 ]: P8 ^! H

$ s" ]+ B7 c: L* Z( jdata_extract:    ;数据恢复
6 D  k9 T$ V2 ]& K8 I+ c. Q  d PLA
' z. i: z" g/ |0 A/ ? TAY
$ C: T% T5 e8 z- }( @- r8 n: T1 U PLA
+ U; J! [) @1 L1 [4 e TAX9 G! Y1 n0 Z8 d" E+ ?/ v
PLA
; d" \2 D- D9 H& @5 S# @3 O # H* b% T1 {* L$ P6 j) U  t) k
return:
) Z0 s+ }, {9 U4 L# t: B9 o5 E RTS
% I0 C% w; O6 j9 @ * W. i1 k; O6 c+ j
ora_data:   ;按键相或数据" Z* t0 C& B" i  q  A3 W' B4 _
.BYTE $08,$04,$02,$01,$80,$40,$20,$103 d# g8 h( i6 }, y) f" [
and_data:   ;按键相与数据( S+ H0 Z' O' ?; [
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF  u) k6 F; V' l7 w2 s+ c
- k+ ?  @9 n1 H3 b( L. C7 A7 }( l, {7 l
; o6 ~/ h/ ?* f' U3 p6 N
( K- D' O" a3 I( ?: _6 {
;FC数据搬移程序 BY FlameCyclone
$ Q! N/ h" K% b+ `: ]9 i .ORG $82009 V7 [+ R2 \* M; }, q  }) F
JMP DATA_COPY_PROTECT" @4 M2 S0 h6 r* Y, D

& s* m# u, F$ `$ }' JADDR_DATA_TO = $40    ;目的地址
* Q9 t* k) U! j* F  AADDR_FROM_START = $42    ;源开始地址6 k& U; K  Q% E& h& F
ADDR_FROM_END = $44    ;源结束地址
  f! y2 }% y' `+ I: c7 y- D, l+ m' \* T$ o
ADDR_TO:    ;目的地址
) `1 z! O) _1 g/ |* v% o$ r .BYTE $00,$70  ?6 r( @1 Q1 K4 X5 o+ C1 E( O' `
ADDR_BEGIN:    ;源开始地址
$ @2 K1 Y1 J/ n2 F# Y+ ~0 U .BYTE $00,$833 q! ~3 O% n' Q3 u2 K
ADDR_END:    ;源结束地址" l# H( W+ ~0 `9 O
.BYTE $FE,$84: y9 {  N0 {7 L3 s$ H9 x
; f. U- l& d5 t2 r1 @1 X9 ]! n& d
INT_ADDR = $08    ;中断地址
/ a4 s; W5 a/ [$ d% n; {- f$ FFLAG_OVER = $71FF    ;完成标志& U7 B5 t0 i) u2 u

' `* w9 h1 ^( g) L; B9 o' A9 X( s9 w* |
DATA_COPY_PROTECT:    ;保护数据
0 f" z$ a( ?' N( C PHP% F- i1 z9 J. x" U4 U) y
PHA2 i, V- U3 X1 e2 B+ r( l& c
TXA/ m% P% w* L( x- G3 `
PHA
- E! v1 J1 n$ Y! F; D2 q TYA
) P, G1 c8 k; h  b1 H( B, y2 R PHA4 q0 l7 S0 g+ v
LDA ADDR_DATA_TO
- k3 a8 E9 t" u/ S' {2 D& e& L PHA2 M& Q# @' ]9 O! t
LDA ADDR_DATA_TO+1
; ]0 |! }6 j& \8 \2 k( C PHA3 A0 `) k- V9 {. G- c
LDA ADDR_FROM_START
+ k: x( d6 U! D# D PHA" |3 ]) @0 f+ x( g0 Z- E6 ]
LDA ADDR_FROM_START+1/ }4 \  P6 a: S" ?+ y! `
PHA7 P% |- ?! t, [* N+ X6 i) i
LDA ADDR_FROM_END: t( `7 u, X5 E8 ]1 v/ `! l& H# A
PHA
5 V* a. I- u: j4 p LDA ADDR_FROM_END+11 O2 H" p* j/ J' v
PHA/ D9 L$ M1 ~  ~/ S+ O4 O8 H8 Y$ h

+ G4 U1 P4 Y' }& SOFF_INT:   ;屏蔽中断( J* t! Y2 d. u+ u3 W5 r, S
LDA INT_ADDR; C) v1 Y  c3 i/ m
AND #$7F
: Q% X: m' W; R  s. q STA $2000    ;屏蔽中断5 y' }6 t" `3 @; `4 ]' Z( s( O
6 i2 M' \3 D8 u4 C, ]5 r
6 M  d5 ?' \1 O0 ]# `- G
SET_DATA_ADDR_START:    ;设置复制起始地址$ o# J& O3 ^5 |3 R9 V
LDA ADDR_BEGIN
% _& J& H5 ]$ g' T" l STA ADDR_FROM_START    ;设置复制起始地址低位
6 b6 r. X5 C. T: Z* e  B$ q LDA ADDR_BEGIN+1
7 j- w" o7 q" N. ~; O; Q$ ? STA ADDR_FROM_START+1    ;设置复制起始地址高位
9 K' H! ?8 w$ e ( C: W" j. i9 ]# j
SET_DATA_ADDR_END:    ;设置复制结束地址) [; X. ^# @  R$ |5 ]; l+ Q* f
LDA ADDR_END) A. n5 V, Q( e8 q' s  W
STA ADDR_FROM_END    ;设置复制结束地址低位
7 g& q6 P" L9 X5 S* U5 c1 k7 E- t LDA ADDR_END+1! m, x2 ?  n0 [' c$ s) C
STA ADDR_FROM_END+1    ;设置复制结束地址高位4 r) g. G& _# C2 b- Z

, P/ D+ ?. _2 e' L6 jSET_DATA_COPY_START:   ;设置目的起始地址
' j$ {+ R( @8 o8 D9 q5 `# h LDA ADDR_TO' R2 f4 W6 g7 h! r1 _, c2 f
STA ADDR_DATA_TO   ;设置目的起始地址低位' C# s/ _5 W3 s6 X
LDA ADDR_TO+1
  X1 p( B0 o! i4 O* W# g' r3 p/ N7 K STA ADDR_DATA_TO+1   ;设置目的起始地址高位
5 n% m' W' H/ R; ~2 S: |( y - F  _/ J4 g& S
OVER_COPY_CMP:    ;复制完成比较% p5 q9 X5 z9 |
LDA FLAG_OVER6 n( K3 u8 Q5 i
CMP #$FE    ;复制完成标志比较) i$ L" E! e) r4 p% u% g, Y: l
BEQ DATA_COPY_EXACT9 a0 y4 b6 |1 h, i( l

4 I* `, h' B2 G5 SINI_XY_COUNT:   ;计数器初始化+ A; h1 o" J! P- q& t- k: T
LDX #$00
% Q3 |! ]3 a$ @7 m, ^* h LDY #$00# p) V. a% o: S0 M: }

, s3 t$ Z: j3 Y7 mCOPY_OVER_CMP:    ;地址比较  u( ~: u6 j7 I* g
LDA ADDR_FROM_START# i/ \" s8 v! B8 b: `2 O
CMP ADDR_FROM_END/ U! Q1 Y0 A6 Z  M
BNE COPY_START
* M9 v3 k% h. D! W LDA ADDR_FROM_START+1
+ i+ O" H! U: i& _: H7 B) x CMP ADDR_FROM_END+1
7 e( B. Y1 ?2 w" N/ y% C9 R BEQ COPY_OVER. J/ [. w" A- G, m
7 v1 s+ a( t7 p/ Q# Q
COPY_START:    ;数据复制开始! I5 }* R# P1 P
LDA (ADDR_FROM_START),Y    ;读取源地址
5 o. j8 J9 f4 V* X STA (ADDR_DATA_TO),Y    ;写入目的地址; r9 @( @! a/ `) A0 J
INC ADDR_FROM_START   ;源地址低位递增
& q, l; z1 M$ ` INC ADDR_DATA_TO   ;目的地址低位递增
2 d& X3 Y4 H6 I3 N' |, |, m BNE COPY_JMP+ @6 J: M4 v0 J1 p) v# i4 w# S
INC ADDR_FROM_START+1   ;源地址高位递增
! }* B) O) `0 l$ S5 R' q INC ADDR_DATA_TO+1   ;目的地址高位递增
( y! s1 U4 E/ c
# P. w; ~7 C# ^- |  g; L5 H* ?COPY_JMP:   
: z9 p  a: K, a) T* ]1 V6 [1 Y6 r! B JMP COPY_OVER_CMP
9 {- x: }! T# [$ a& e/ G* g9 d( a4 o  b
COPY_OVER:    ;复制完成
" w1 |4 J$ C4 P LDA #$FE- l2 D5 U+ P3 j% u+ B! p
STA FLAG_OVER    ;写入完成标志# k- i$ X$ q! B) i
FINAL_BYTE:
# o8 M  g7 d% e# W; p. z LDA (ADDR_FROM_START),Y    ;读取最后一个字节; B2 U: j, o' r9 M  ?
STA (ADDR_DATA_TO),Y    ;写入最后一个字节* c, s9 G5 Y$ d" L% U0 v
: z4 j8 o" B- R* E3 m0 C
DATA_COPY_EXACT:    ;恢复数据5 E% z, \* Q- Z9 a: m; W6 [
LDA INT_ADDR
7 z8 j$ p& q  L8 \, y+ G STA $2000    ;恢复中断
' [  i1 T' W% L+ k+ r+ v) _0 `6 Y. D PLA
1 h3 ?9 U5 o6 @: H1 h3 }6 Y STA ADDR_FROM_END+15 S' _% f) m2 F: r6 x  I7 J& Q; }
PLA
( |: E# Q' S. p4 g$ F% O STA ADDR_FROM_END
, s6 n4 q* s) G# w5 A% h; _) V3 F PLA
" }6 U- b0 Y0 C$ I( s5 P  A2 j; j STA ADDR_FROM_START+1
' \4 R( O: d& O! V# I+ @ PLA) v  x7 r( C3 W- B5 e
STA ADDR_FROM_START
2 ^  B$ F6 k7 o8 A6 B PLA
: S# h7 E6 D- y$ ? STA ADDR_DATA_TO+1- m# A& h% K) y+ x, o
PLA8 _+ j' R1 m) Y! k3 U9 J
STA ADDR_DATA_TO
0 X% n4 w" U% ~1 b PLA
0 k" [1 q  n2 j8 ?$ s* s# K TAY
: R4 ~) q6 @  j" o6 Y+ m PLA
! r5 ?# k0 c8 n9 t TAX  ~$ a, v/ i# W: h9 m9 s; o
PLA
# d& n9 F: }+ y/ Z6 Y( t PLP# E5 k8 p4 u) P6 B5 {3 ^+ g3 g7 e2 Y

2 w$ @4 h6 T% x' @3 G- i . d8 a5 @  o# ~* u' g1 }

2 r3 K* y; y- C$ F6 K+ dDATA_COPY_RETURN:/ m- I; [; |) l: h/ O
RTS: P/ k0 C- b6 ~( e+ k" s

, G( D! G, @" q8 z8 j  I5 r# q# g8 R .ORG $C056    ;精灵指令覆盖
1 M* e- o+ N0 W6 X6 Q JSR $FFB56 g4 [; z" F5 W7 e4 P5 P. ]! X( ?0 o

) q7 M, A$ [. F2 i! W9 m; q .ORG $FFB5    ;
0 [. N& I$ o, s* v PHA5 c/ Y; m4 {0 ]7 C& S) q3 ^  d7 q
  TXA
/ u' }! V0 [) Z$ k PHA0 I1 S1 S* ]: H6 ^& q/ L$ _
TYA; q9 e; t, o7 |
PHA
5 i* T" S% ?7 |0 M% n& n* \ LDA $71FF    ;比较7000-71FE数据是否完成复制
' H3 C6 K( O- Y3 E9 {2 w) _$ } CMP #$FE( I8 O. j5 u* ~# ~3 a2 _  N! z: W
BNE ADDR_FFCA) r" b& x& E6 S3 U: J' M
PLA6 ]2 x% N* G4 z8 M9 w) G
TAY6 a- j6 ~$ ~- j/ ^
PLA+ a- C1 |0 |* |$ t! Y
TAX7 i; ?+ n5 N" }* C# }
PLA: z" F  W2 T( z6 C' x  g; M' o5 n
JSR $7000   ;跳转到自写程序9 L4 Q& s" w; W, z& r0 C$ `# V1 r
RTS, v% |5 W; u7 S. Y
ADDR_FFCA:
( G+ {2 H4 {3 r7 o  h; E) W0 C PLA
1 \) ~; s, M. v5 `- Q, q TAY
& v# _$ G+ x# U, H4 x& d PLA
6 `; w0 l$ h; O+ I+ P TAX% ]0 Y, Y4 p, N' A
PLA
0 a) _+ Z1 t( ]. H8 V RTS3 j0 [  d. C' A8 B
) @. P8 o/ N- x* I. {$ z

1 v4 e. k0 p4 A% u1 Y8 m
! g& f0 }! }' G0 p' v8 G .ORG $C264    ;自定义的MAPPER2切页程序4 |9 C0 D, P2 R, D3 D
PHA/ H/ b8 {# f9 W* g# R
TXA( C/ Z! m& ]/ G
PHA
* T8 k, e$ P$ G3 U" W5 p* k' X LDA $0066; p' ^5 h. g+ o% ]  u5 l/ i  u/ D
BNE ADDRC280. F$ m( Z6 V8 k
LDA #$07
5 X& @: O9 G* i0 y4 _ LDX #$03
; ?& O% G. c# e$ v! C$ l0 G/ L JSR $CD9B    ;自带的切bank方法' j3 {0 G' ^; k
PLA
! z1 A4 T$ \3 ?( u$ O, a2 f/ M TAX8 R" @9 e0 h/ h
PLA9 \% L3 [# _/ C) d* [
JSR $80001 f- X8 ~/ s2 c- K4 q  w& y
LDA #$06( S3 ~" `5 x7 \- F
LDX #$03& p( V$ S( F1 p. d6 U
JSR $CD9B    ;切回原该切得bank(可以不用)- U& U6 a6 D1 ^% ^1 z
RTS4 _$ r2 d. D" C1 |" {8 \, p# l: }& r! k
ADDRC280:
: k& g+ g& H  u* x; {; ], \. V: { PLA
' i" m( u4 p2 |5 d) ] TAX; H9 J: O, W  M" z
PLA. m  ~, @0 a2 q( i( Z6 ]
RTS1 @& t, Z+ T2 K6 ^! f0 w+ _+ Y+ I

+ b2 B0 ^7 h- ?! }- g9 w4 k  N 0 E9 T- O. O. H" q! K& p
;[FC][最终任务PPU][END]
- Z" N+ }5 \7 j0 h0 D, g .ORG $C056    ;跳转到PPU重写程序' J" o9 F  A1 ]) ?
JSR $7000
8 O8 T. q2 K; e5 v' Q, ^6 ?8 E+ T
: k% d5 g+ g' z  b! h .ORG $CEBF
! H7 \$ }5 y4 `  a" v. H JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入. U! s6 g3 ~/ u& }4 P$ R
  5 Q1 b' ]" E' x
  .ORG $E460
, T; t$ y6 b1 g- S, j! x# w! P2 D5 S7 B  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
& b! G& E9 i' U/ Y9 Y8 L8 n  
' H. f5 ?0 X6 b( \4 k .ORG $71F0
5 E$ K+ F5 g( a/ R! H$ LSTAGE_DATA_WRITE:& \  L6 l0 J: Y4 Y3 \- p* M8 _
  LDA $60101 W" p7 |# a9 ?0 s1 W8 p+ F# |/ y
  STA $1E    ;关卡写入
7 J' h: t) `8 W! h6 E4 m3 I  K  LDA #$00
* }6 Q- W- k! l( M! p& B  c- G  RTS
% v  m# ]9 e0 k0 @+ j, r, ] .ORG $71C0
$ R& r' [" ]7 Z6 tBULLET_DATA_WRITE:    ;副武器数据写入
# i# _2 T: o  S7 [, m CPX #$0E
5 p$ D& o- u8 m1 R9 z. n3 J BCS P2_BUL, N: l, J, C* ~; t% q
P1_BUL:
( f- i1 a9 o' ?- ~ LDA $6004
9 C2 ^5 ^( k7 D1 L$ Z JSR $D7D0    ;P1副武器数据写入
' z; c# K0 p" |$ ^# H/ [0 \0 @7 P5 A RTS2 D1 j( C; l4 D, ?/ g2 a, r" D
P2_BUL:& V) X, n7 T) \
LDA $6005$ s& w! t: y5 e7 b
JSR $D7D0    ;P2副武器数据写入+ W. D6 y; c* Q2 H& {; P+ e- I: t
RTS
" U! p/ m2 \. w9 G& v9 E6 g+ G6 Z& a& ^* ~9 {, a& W2 [
4 Q4 ~9 F7 J" O" @- l
.ORG $7000
7 U2 M* a# P3 v  
+ P8 l' V! M0 m1 e: l6 v  e0 T STY $4014    ;补上覆盖的精灵写入指令
% p# N8 ]- t4 ^- U% _7 ~" A PHA, W$ ^6 ?  O# v% }! T
TXA" D! q- I9 U; C& B
PHA# c1 i$ A4 N1 `! w1 E8 U
TYA  ]$ X8 m' ^# b
PHA
: Y$ O- _, B( Z5 _4 x/ B LDA $0C
" A$ Z' J  U8 J; C CMP #$01    ;比较是否为标题画面
! x* R. y! F1 `2 T5 G BEQ PPU_STAGE/ D6 ?9 H3 I2 u
PLA( ^) T, Q' x1 k1 e8 y0 c) P0 a
TAY( ~* V4 [9 p% d8 I+ q  T; y8 l, `
PLA) S) X1 c1 y& n
TAX
6 U3 Z0 h  x: V/ O0 [1 X. q; j PLA
* l3 {9 I& D* f+ t4 R8 p RTS
8 u. N/ j2 }0 XPPU_STAGE:    ;STAGE显示程序
* V3 c- C5 I5 n3 P LDA PPU_ADDR_DATA
( U+ u7 C* H  }+ M' v- z STA $2006
  P+ K# {7 a. n9 x5 V$ Z) o  g LDA PPU_ADDR_DATA+1* ^+ p# U& P, z1 c. E0 N
STA $2006    ;坐标设置
/ D! R1 k& n0 u) O% d, O LDX #$002 V4 n4 g+ [: Q% K3 z1 c
PPU_STAGE_WROTE:    ;写入STAGE字模! F9 p  b7 U8 K" `+ o% t
LDA STAGE_DATA,X
0 i3 q' C7 x3 a7 I! d0 `: h9 F: q STA $20075 Y! G! l" P7 e+ h& C: @
INX& ^6 c  e: y  w. ]1 r; }
CPX #$06
, g, n! \; \( v, o2 u! m/ e2 @ BCC PPU_STAGE_WROTE4 e9 R8 @( C. L$ [! H. q2 z$ u" `
LDA $6010" N/ h) @4 q* ?3 O& U! m9 Y& @- u
CMP #$FF    ;关卡数据初始化条件判断
; o2 o& [* q7 R- {( U8 w BNE KEY_B
( z# p% z8 D" e+ e$ f" Y LDA #$00, i" Z) w, X( Q) J" c
STA $6010    ;关卡数据初始化
7 l/ k9 q$ h0 X# R9 o; j+ ~4 J4 bKEY_B:    ;关卡减少" l  n1 i* P  ], u1 n1 q$ N3 |
LDA $04
1 n: j7 {2 A) L3 ]4 g; F& q AND #$42    ;按键B或左减关# [% l: T/ f5 d" D) g6 t
BEQ KEY_A
% r+ Z; Y# r0 t% q  @ LDA $60104 {$ ^0 I" B; g4 \, z) L! v; S+ X
CMP #$00    ;关卡比较$ H) _) a2 Q  E1 R6 n" f5 H
BEQ KEY_A
9 a" p( e) X% N* H DEC $6010   ;减关
4 A$ A: W" t8 @- D$ L- pKEY_A:    ;关卡增加  A+ d6 a; b  e- c8 L/ R3 p4 s
LDA $04/ w: P" k4 E, G* d0 x
AND #$81    ;按键A或右加关
5 ^% W% C- s( t1 t' `0 E. g BEQ PPU_NUM_WRITE, g( p' F; g. n4 P4 K
LDA $6010
! u" l$ n  R1 |" q, @( C) \8 V/ w' B6 R CMP #$04    ;关卡比较
. ~3 y) f. N* q* b% z BEQ PPU_NUM_WRITE
5 w4 f: F# E2 V8 T1 s INC $6010    ;加关, _: F5 w  H1 i# N
PPU_NUM_WRITE:0 f4 T4 N& O1 G
LDA $6010
/ q7 k5 F" ^! R, j2 @; A TAX: `1 K% f: F& h# ~: u5 \8 K
LDA STAGE_NUM,X    ;写入数字
% m$ b2 N7 j% q2 h STA $20077 i$ a6 O% I0 \# T; Q$ x. O
PPU_RTS:
: k3 }$ m7 k. J1 R PLA
; q9 D% j2 ~4 j8 H& ? TAY
. ~: P- K+ B7 R0 ^' k# n6 \! e PLA
& P2 a2 C; i7 C/ `7 `0 e" U TAX. {: b$ v% A; e9 H
PLA
. W7 x) s" K' y% k+ Q6 W RTS/ z, X' F1 K9 E: `0 b- _# y/ s7 K
; i1 a, j$ Y6 W! v

: g* [9 C  I4 _2 }STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据0 I5 ^) B1 i* M" a- O8 Z
.BYTE $EC,$ED,$DA,$E0,$DE,002 C6 v5 u) A' A  s
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据# x( C! j- v7 F& ^
.BYTE $D1,$D2,$D3,$D4,$D5
0 E. H) a, S8 r1 ^4 ?) Z
7 P* b- k6 V: e5 g/ b: Z/ kPPU_ADDR_DATA:
* N" K( X4 @* n' e$ s5 w .BYTE $23,$0C
" O  _: J% b( D' W: @$ x 8 H  a1 |* @: x( n9 Y

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2025-11-19 08:44 , Processed in 1.106445 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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