设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 : j) f9 z8 {. q6 X' i/ `7 U
8 Z# y  N8 ^  g( |* ^) m( K
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
! N# G0 G8 p6 S: m( s) Y% L  U然而,今天想到一个思路.- `6 l- [$ F4 V4 g$ j
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去., G4 o$ }% N; D$ z' X* Y
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE* D0 w& O% z  q$ I. a' G9 _
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF)., S$ A" p& i+ g; _" f

' {4 @$ a2 ^( j, i3 ]
2 g. A5 g7 v: i1 r# g7 G: J/ N;[FC][最终任务KEY][END]. T1 R4 ?  ^3 |8 d1 z
button = $04    ;单次按键8 E# Z/ Q" C- f. x
flag = $6000    ;功能开关标志# k; I, |# M% F% q$ l" r9 ^( p+ L
pause = $000E   ;暂停地址* u4 e1 Q6 ]9 P3 X" g1 o
1 i" P0 g# r  v- q- n
.ORG $8000& h( ~+ m7 ~; X1 c7 a: M+ G/ L
LDY #$08    ;自带的按键程序6 z% z3 l* U# w% N- M. b( u
ADDR8002:
# }4 C# L# D& Z4 q4 Q6 D LDA $4016,X  f- e5 k6 {& M  ?* @/ x
LSR  ~9 y3 F/ B- {' [1 I- b
ROL $0021
2 \  N4 g; l- e2 y LSR$ m, ]( x8 E' N
ROL $0029
+ n8 ?' G0 z6 \! n- K3 m1 u DEY$ F+ n6 u7 W* l! P& J. |, w
BNE $8002
2 L- |. ]5 i1 U+ f6 w% f5 M LDA $0021
5 q3 f/ |! k5 Q; ]: A2 L ORA $00296 e1 T) n$ ~, `
STA $00211 A% V. G5 [4 z
LDA $0020
- f2 h' Q' I! |) {) }; k AND $00218 T1 H) P: v0 {9 t' Z! y) {
STA $00206 G3 R2 t. ^2 L/ ?
LDA $06,X2 X7 J, ^; A7 x# K; K# i# `3 S
EOR $0020" f1 A" c) d. _
AND $0020
* Z+ G$ m5 x5 v* V( Y6 ^7 x7 V STA $04,X
- b2 W# A' N5 Z5 K' x+ L  M LDA $0020+ G' Y* ?# D% `- [" b
STA $06,X
5 Z  X2 m. b- a6 i JSR KEY_OPERATE- G/ U& _; g" g0 p/ y
JSR Function    ;功能调用
0 \2 {2 q0 ^! S' ^/ }' b JSR Weapon    ;武器切换调用" u4 U8 h* R+ ?/ l
JSR Power    ;威力调用
( c# L$ Z. J! e- ]8 m$ x JSR BULLET_NUM    ;子弹数目4 ]4 y* D* K0 ?  i
JSR BULLET    ;副武器类型# g5 D! S. X1 X% s# ]: A0 \
RTS
; n0 I8 }5 B( ]' s) _5 [
& Z% C! p2 u4 s9 f' {+ @0 ` - C- J$ J8 g  c" ]' u4 j$ a3 g

8 |3 k: g; ?1 @! q .ORG $8050
) [4 `: h2 h4 L" t6 U/ v  B1 E$ q/ w( AFunction:    ;功能" |$ I5 m, \! ^$ G
WUDI:    ;无敌; e+ U% I5 @/ T
LDA $6000,X9 x6 A/ ~8 J- j2 [0 t
AND #$08    ;开关判断9 p" L* x* k& y- f# `3 Q2 Q: X
BEQ LIFE
5 K1 j6 C' r/ R LDA #$05
7 X8 J! d* t7 ? STA $05DC,X    ;无敌锁定3 R) \8 c! u# F3 d! B0 s
LIFE:    ;生命
- a. I( s( k) ~4 @ LDA $6000,X4 V, _0 R+ T0 Y
AND #$04    ;开关判断& _3 R0 Y4 o' B' O* C6 {: M
BEQ FUNRTS
8 @" N8 q% W  t, n2 ?/ ^7 ^8 T LDA #$05
- G2 y$ n7 N9 E3 }. D1 ~) ? STA $1C,X    ;生命赋值
* E1 {4 X1 N& e* {* b( J; }" q' EFUNRTS:
; y' d7 t1 i6 J5 F% I+ C RTS
% Z/ Y( h- s9 \( M2 I
6 `5 N5 e; @+ X* L3 IWeapon:    ;武器切换
9 q. _  _) ^& `9 c LDA pause    ;暂停状态判断) c- }! s( M1 |6 F& c; a
BNE WEARTS$ j3 _7 t- m: w* z
LDA $04,X( }: N+ x! d; ]+ @0 A$ w
CMP #$20    ;选择键判断* x4 F% g) F! n, ~) p! u1 D9 c
BNE WEARTS
2 v8 _  r" X! n0 I$ m' y LDA $12,X
! U: J& ?3 L, H9 T CMP #$03    ;武器值判断
' n% V' D+ V( [3 w BCC WEAINC4 P* P1 p* p* V; Q
LDA #$FF
/ s# h2 ]' T( @ STA $12,X    ;武器重置
) d  S/ ^# U: N2 R; NWEAINC:
' k, F( `/ p4 X: I& { INC $12,X    ;武器增加
6 `) P& E: P( @) a2 K6 Z ( O) i" r- V5 b) d/ Z, o7 M% P+ }# x
WEARTS:
! w5 m4 k' K$ @: v- [. o RTS$ W3 C* {7 _  i  c

8 t  V5 d0 l2 d7 M% D7 `  pPower:    ;威力) i) I3 a7 {' P
LDA pause    ;暂停状态判断
2 q, w- n0 S4 @  l4 R: e' _3 h# u BEQ SPERTS
+ v* W, K% H! c+ h' tBUT_LEFT:
5 ?( ]: X3 Z( a  \0 }: F# r7 E LDA $04,X# ?2 w8 Z* r1 ?. u& ]
CMP #$02    ;左按键判断5 x' q9 h! M; O5 B  x% V3 o" g/ [- Z
BNE BUT_RIGHT3 P' D* [6 F+ f* f2 Z7 y! e3 G
LDA $88,X
* E+ P7 b( E4 S, @, X: P CMP #$00    ;威力判断
% j& K+ p" T9 V+ R, k BEQ SPERTS* v% }2 `6 `! \  o2 u
SPEDEC
5 a2 M( R  A/ Z/ @! m5 S% g* ~ LDA $88,X    ;读取武器值/ Q; l% }" Z+ F
SEC6 r' G5 d. ^- d
SBC #$085 ]" [5 c. f7 H- e6 I* h- @
STA $88,X    ;威力减小
* U; d: P# |$ ?* Q! v9 R: uBUT_RIGHT:4 j, A0 a& |0 d& a5 v
LDA $04,X
" t) s6 ~, V7 E7 [) i CMP #$01    ;右按键判断5 s9 W. Q1 Z, f+ e2 k
BNE SPERTS0 Q' p& \5 y' |  i6 ^7 }
LDA $88,X
( g# H6 i- `' G  `& g4 L CMP #$10    ;威力判断
+ E+ a6 f- K- Z7 L' s: X- t. Q BEQ SPERTS
6 G+ D8 K0 @  I0 F- P  [# |% h8 bSPEINC:
, w! Z4 \- F/ s LDA $88,X    ;读取武器值& ~: L, Y1 P: D1 W
CLC
  V; p$ A! V( s' k9 _* i ADC #$08
" p: {( V7 l* |4 I8 d STA $88,X    ;威力增大3 X6 o* v4 O5 x7 M0 J
: ], }7 U& ?- q6 a8 A1 ~0 |
SPERTS:
0 p  N$ q8 `  i# [. N, F6 W: c RTS" ]) }8 M4 A% O
7 `5 `0 z- P* S, K- r
BULLET_NUM:    ;子弹数目* g/ w/ O: m, f4 ]3 w7 u
LDA pause    ;暂停状态判断
6 @  a  x5 l1 g BEQ BULRTS6 t/ H% F, O) M6 y! K
CPX #$00    ;主机玩家判断' F- E) x7 E# j0 P8 M9 n
BNE BULRTS
- R+ F4 q' @, a# o; M" p5 Y3 d LDA $04,X    ;主机玩家判断
6 N5 V7 R- x8 i+ G5 U+ U# k  V AND #$80    ;按键A比较
4 X, V# d/ k6 T& h+ ~3 y BEQ BULRTS
3 ]4 H* b$ E8 X8 }) _ LDA $87    ;状态判断; X( J; x( i/ t" i( y  |3 J
BEQ BUL_21 {+ t! V/ ~( a$ ~0 j( o' n
BUL_1:
4 f/ a* L6 j, ~ LDA #$00
2 n* j5 w. Y& b STA $87    ;1发子弹
; E8 E* p8 I* U: W# ?) e BEQ BULRTS% Z! Q$ s( \& p
BUL_2:
/ T. u5 v* q6 R( o LDA #$01
3 E. x& d3 y  _6 W" | STA $87    ;2发子弹
6 y. Q$ ^: D' ^' P* s3 a/ L
5 x9 [# w' c! d- M/ P& f# {BULRTS:7 t  y! a; r" T0 v3 B
RTS' |% a* n# Z. m  |
& |3 u- s( Y$ }8 z. @0 |; D5 n# Y

8 B3 p% h, k+ y5 T; HBULLET:
0 }; i, B  ^" N. s LDA pause    ;判断暂停状态2 B# z: A' l9 E5 U& g
BEQ BULLETRTS8 X. g9 }' \5 t* U
LDA $04,X
6 }2 i: U! H- l, [1 V$ L3 _ CMP #$40    ;按键B比较7 f' V, x& R" U! F
BNE BULLETRTS" n& Z' R# q4 u& E
LDA $6002,X    ;读取副武器
4 _. z- H0 O0 J3 J7 E/ f) v CMP #$030 h4 Q) B5 y. {( d0 E5 Z
BCC BULLETADD
; k, u' \7 a5 U  i; I1 m LDA #$FF" U0 `# w2 [% H# c
STA $6002,X% d; B6 ?6 Y3 c2 d
BULLETADD:
( l# K, l9 L1 z/ Z+ B INC $6002,X
0 P2 V/ M( \) a6 F4 ~% F5 h% ] 2 P. i9 z3 c# {
BULLETRTS:
" A3 F' X( e  }) u3 `# H LDA $6002,X" v1 ^" _6 i3 ~+ ^
TAY# Q+ C: Z; F' N0 o& f
LDA BULLET_DATA,Y9 H4 f, r0 g! y+ o& u6 [  h* r1 f
STA $6004,X    ;写入副武器数据. x3 E% K; @: ^5 m
RTS" S1 s1 i! \/ y" G* D2 [! N

( O% E; `, h9 j* ]
0 m, a  k% h- p4 SBULLET_DATA:; c2 ^. T. \* O
.BYTE $06,$02,$03,$040 v& Z/ {* U0 r/ y8 x
! G  U: Q+ m) D8 a3 t& m+ H

, \: I' T& v6 h! d9 `& F' K 5 d4 T  I* u6 e1 H
KEY_OPERATE:    ;按键开关操作. b* d( _3 f8 t0 D
data_protect:    ;数据保护) x2 R4 z# D2 m; ], |
PHA; }; W" f" d( I9 n
TXA
6 {# Y% ^1 Z$ r# j9 D PHA: y" E* r/ C, p9 \* r6 j
TYA
6 e: g; k7 K2 a- V4 ~ PHA4 x8 Z' M) A1 w4 B4 F

0 M9 p% s& `3 s- v: U) o0 P  F  rFLAG_INI:    ;开关标志初始化  F4 x( _4 }8 H* z/ m; R

2 u( ]' Q. N1 o" j5 Z, [5 V7 i  V7 [ LDA $600F% \! B9 k  [+ F2 S  N1 N9 ]
CMP #$012 E* H, W7 ]; N: B9 R
BEQ pause_cmp
$ V0 p7 V/ b+ b! K LDA #$00
: u2 ]! s0 q$ i STA $6000& S8 F- |& p/ ?  D! Y
STA $6001
( M* i+ n* o5 X6 f" ^ STA $6002
4 F# j6 ~' F# C$ }1 J1 Q, D STA $6003
. M7 {  _% W5 B; Z STA $6004
# x! ?3 x$ K" i2 M STA $6005! \! k4 Y3 \+ m: D( G, d3 n
LDA #$01
  E& E( o8 e( y0 j STA $600F( t3 Y8 v: \( t7 K. b
7 y6 O" a( o7 Z
pause_cmp:    ;判断暂停状态: h( N4 F# ]$ E% `  W
LDA pause0 q, D) y1 ?% @2 @& b
CMP #$01    ;判断暂停状态
1 u! H6 I1 e! t. @8 z  D BEQ button_press7 g. X2 K7 C9 x3 k* [
PLA
$ ?4 ?" {& N% G8 }6 e TAY  U& [0 R3 {0 A7 l8 |0 t
PLA
+ ^  Z) T( ?6 ~# S3 k. @ TAX1 r3 [& d1 H3 c9 v( Z; [1 v
PLA
6 b0 t, n. V, U& L: [ RTS
' |" |+ g- d) y* a$ {& b. {5 i  I; l9 l  D) [1 v& [3 N
button_press:    ;按压操作8 h  f: E% w/ z0 t% @9 U. c
ini_Y:- m. [9 B( [5 p- b
LDY #$006 O7 V  b/ }1 @' |, [# Q1 ~
button_cmp:
" v9 r+ G6 C1 Y! L LDA button,X4 ]' }* x5 @2 Q! T' K9 H# ~
CMP ora_data,Y3 g( Q3 Z4 b+ U) k. c" v
BNE count_Y_cmp
0 |( }- J4 P: b* E1 U% M9 [& a" Q& {flag_cmp:
% G- g6 ?: ], C6 b7 ~4 I5 H LDA flag,X# r) \- |, {/ U, R1 V7 P& i
AND ora_data,Y
& N& p- u* c5 ^. l+ z5 A BNE flag_and
0 Q( h! o" e- Xflag_ora:9 p. |0 e; k% m3 w* N; d  Z- k8 \/ y" i
LDA flag,X7 o0 X2 J1 I; S+ L7 H
ORA ora_data,Y
' S1 A! l( b. Q STA flag,X
) V' ~/ ~. g" z- Q BNE count_Y_cmp" W2 m8 p: T% A: U; }" o8 O
flag_and:
* T4 m3 S+ j$ j9 @ LDA flag,X
4 Y1 T' {; i" F' n AND and_data,Y; C( H' X- \) c: W3 R# j& s  b+ `9 D
STA flag,X5 [! k" L2 @7 k, W
count_Y_cmp:  I4 X" x5 e" _5 n) v# Y
INY
- T; W( o" _7 C" ^* } CPY #$08
; U5 h8 `3 @% G* |% { BCC button_cmp! i+ g: @% C( D

0 i8 `, f- d9 f2 v+ ^data_extract:    ;数据恢复
- F  Z8 E3 J+ Y( E$ M PLA4 X9 [0 k) |* O- u1 J! r
TAY
- I. r: n* c% J0 ?- Y PLA
# ~1 k  s' K+ h  | TAX
' A3 s' t: I' N  T- x1 x PLA
' @, p, p( p6 |4 ^5 }* C  | / r! O) y; P2 a" L' o. n) b: s
return:
  q! ]4 R7 {- k7 ?0 F/ J RTS
. P6 J9 F: ]! w4 r4 m/ e 4 ?" n( S1 C8 g  }" K1 G0 W
ora_data:   ;按键相或数据! ]2 `4 R. q8 ~( z# ?! j; e. W
.BYTE $08,$04,$02,$01,$80,$40,$20,$103 _& K6 P7 k  D* j& h! e7 H
and_data:   ;按键相与数据
  I: c# L- |- Q3 g .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
( w$ q- o# n4 _# w# |3 k# p
) m- c6 i, C# e9 ~7 u5 N: d+ R- M
: m4 s, ]+ A/ }0 P0 _8 h
9 V( C8 `  W" ]; ]4 A ;FC数据搬移程序 BY FlameCyclone2 Q+ V( @/ Z2 H
.ORG $8200
+ \! B& `& n( r0 @4 U$ f5 F, J JMP DATA_COPY_PROTECT; [% M3 P2 k* e9 E; f* `; h

* B' T8 _6 A# r" G$ t5 ?2 sADDR_DATA_TO = $40    ;目的地址( `: j$ w. p" `3 ?, N
ADDR_FROM_START = $42    ;源开始地址* |  D4 c$ {$ n7 o. e
ADDR_FROM_END = $44    ;源结束地址1 X- b# A$ V+ M
2 R8 H/ P- o4 C- B  o8 S, S) N( o
ADDR_TO:    ;目的地址8 ]# f% j. F; F
.BYTE $00,$70. B& b0 A' B- f' N: [
ADDR_BEGIN:    ;源开始地址
' H7 R  W# U% l* W2 D: d .BYTE $00,$83
/ ^* ]7 C6 r( r$ ]) bADDR_END:    ;源结束地址7 Y4 N( x0 i& }. u7 D
.BYTE $FE,$84
/ E7 C8 k) X) o! L; M% F
" j( I* S6 q+ \- hINT_ADDR = $08    ;中断地址
+ O' y5 V. T- X3 IFLAG_OVER = $71FF    ;完成标志
' j- R2 ?4 z: E6 s) C% {* R/ j* D0 W! ?: Z/ Q

: T4 J. t' R3 H& B# X/ \! ]9 hDATA_COPY_PROTECT:    ;保护数据, U8 k6 |0 L5 z) I0 c* k6 @9 b( Y
PHP7 l/ t" e+ b4 z! ]4 `4 F
PHA
$ C- B, Q$ y. e$ M3 o TXA
, h: p4 F& o+ p6 t) ?# e PHA
6 w  Z7 N8 r$ A9 C2 a' ]" M; Y TYA
  E* L; U1 X/ k PHA
. h8 e7 [  p4 ?3 m0 A! C LDA ADDR_DATA_TO$ w% c4 E3 R) ]$ j& M4 c* o
PHA& D; j% C, K! c$ ~
LDA ADDR_DATA_TO+1: g$ j2 y3 g. [
PHA
( v  T, O: a  L  a LDA ADDR_FROM_START+ H! s0 Q8 ?8 A2 o' {8 d: t& k8 t
PHA
. ]( E1 q; d! w$ { LDA ADDR_FROM_START+1
2 Z2 Q0 z, |3 ~! k4 t. c PHA5 k1 ^5 U$ j3 t& h3 Y
LDA ADDR_FROM_END
+ m& B. [* j! M  d5 i- E% S PHA
4 b: M9 m5 J! S  W$ {0 i LDA ADDR_FROM_END+19 v5 ]1 |5 V1 g
PHA
! L7 A0 y6 [9 q7 [$ F& Q! B 9 L- q4 X, w+ D# e0 q' N1 O5 b
OFF_INT:   ;屏蔽中断
. t9 p+ N" E% u7 W8 A- @ LDA INT_ADDR6 x  p8 x  f! m% @( O
AND #$7F; o  V/ R4 Z8 v1 S# R9 s& j" N3 [
STA $2000    ;屏蔽中断8 B3 d3 c! ?$ s( d* k
, Q2 b/ P) q1 a8 T. \% V

: y" S, m! M7 Z% h4 iSET_DATA_ADDR_START:    ;设置复制起始地址
- g  E* X# _) T" L) T  @- d4 \ LDA ADDR_BEGIN' x7 h& S- H2 `% e% n7 @
STA ADDR_FROM_START    ;设置复制起始地址低位
: Y. N. ]( N2 t1 L- J+ Y" F7 e, j LDA ADDR_BEGIN+1
% X( `$ t. `. Z' A0 b, x STA ADDR_FROM_START+1    ;设置复制起始地址高位
& y3 _, m. _7 u4 e4 Q# o! K: N( X/ x
9 W" j. V6 H3 Y2 j* @8 c) g$ \SET_DATA_ADDR_END:    ;设置复制结束地址- {' q, ^$ @+ q/ Q
LDA ADDR_END
: R( y+ x" l1 X  a8 a  E: ~ STA ADDR_FROM_END    ;设置复制结束地址低位# M( {- {$ R1 G& A
LDA ADDR_END+1, S/ [3 Y0 ?2 i7 g
STA ADDR_FROM_END+1    ;设置复制结束地址高位& x, j, _6 v' c9 x( n! `

0 C0 f: }5 L2 A% n7 l0 ESET_DATA_COPY_START:   ;设置目的起始地址; X$ i' [4 R7 `4 l! Z3 Z
LDA ADDR_TO
* E& y  `* t) Y/ C4 K0 W STA ADDR_DATA_TO   ;设置目的起始地址低位
) S4 |2 Z+ F3 v+ z0 d" e LDA ADDR_TO+12 l! [( w, n( K/ D( ^% [
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
9 f9 a8 g: n! ]! a
" N; F' j9 R2 nOVER_COPY_CMP:    ;复制完成比较9 ?: I; k0 R+ z; ]
LDA FLAG_OVER
3 P" |- y9 X6 D- Z' z' }* _4 j CMP #$FE    ;复制完成标志比较
& S; H/ b5 i8 _( a BEQ DATA_COPY_EXACT
% M0 A" U; c0 e. E* b! K& L- F8 Y. W/ f+ |! o
INI_XY_COUNT:   ;计数器初始化) M" [0 ]1 ~9 m$ @, w, P" @
LDX #$00
% \% Z. {/ _) Z/ ~ LDY #$00
. ]+ X& k5 B  b2 o 4 G& t) B% M2 p) ~# Y% T
COPY_OVER_CMP:    ;地址比较1 f1 e3 \( _( {9 P8 d* a4 \
LDA ADDR_FROM_START
- A/ ]  H' Z! r3 S8 Y$ U CMP ADDR_FROM_END8 A; T1 l, k& S& T, {$ S
BNE COPY_START1 a' B$ C/ g7 M* a8 G
LDA ADDR_FROM_START+1
8 B4 ]0 e/ G  r! p CMP ADDR_FROM_END+1" T; h0 i* N" a& \$ `! c
BEQ COPY_OVER+ R5 R& Z" f5 L1 ^) s5 a* T$ t( J
  U! P4 S$ Q( A5 H5 n' r2 i
COPY_START:    ;数据复制开始
1 G. m4 z) I. a7 q LDA (ADDR_FROM_START),Y    ;读取源地址. d1 x/ \* G) _' Y9 Z1 n1 o7 C
STA (ADDR_DATA_TO),Y    ;写入目的地址7 k2 x& v2 e) L! u, u
INC ADDR_FROM_START   ;源地址低位递增5 w/ e" g" b. c3 X1 y; u- `/ P
INC ADDR_DATA_TO   ;目的地址低位递增3 ^: }2 D0 D5 |7 a. U$ g
BNE COPY_JMP
2 S8 e" R3 y7 ?) y( | INC ADDR_FROM_START+1   ;源地址高位递增
& ~9 P8 `: Q- x9 \ INC ADDR_DATA_TO+1   ;目的地址高位递增# G7 ~) N3 [* N" g/ t! L; Y
* k' x$ x; w4 _- E
COPY_JMP:    ) H2 i7 H4 J+ n3 s4 A
JMP COPY_OVER_CMP3 G# l+ U: P/ A7 F* B
4 C6 [( D% @5 z" G0 Q
COPY_OVER:    ;复制完成
8 s4 b6 Y, I% T$ _ LDA #$FE, J, d1 j7 ~' @9 N9 V
STA FLAG_OVER    ;写入完成标志
& J9 s, M* @# B! M7 |; mFINAL_BYTE:7 k2 ]# ~: c, {
LDA (ADDR_FROM_START),Y    ;读取最后一个字节4 R( ^  O0 {1 x: k6 i( z$ j
STA (ADDR_DATA_TO),Y    ;写入最后一个字节
$ h8 [2 J' K+ j% {. P8 r , ~$ @. k7 `; t
DATA_COPY_EXACT:    ;恢复数据
: d3 Y6 ~" x% z6 Y& k6 V LDA INT_ADDR3 R3 ]1 a/ U1 ^% _$ ~
STA $2000    ;恢复中断% ]3 ~4 q' E$ R5 i1 Q
PLA1 h  P# ^, m7 _9 G1 w" f# i
STA ADDR_FROM_END+1
0 @) T$ x: _# M. i$ _5 h; A PLA8 p  P: d: a5 B4 U, M
STA ADDR_FROM_END
2 D! a; ^% @( I( x& @( d& A PLA: P, @6 T1 G  p% a; d9 J, Y
STA ADDR_FROM_START+1
4 P2 r; o' b/ q/ f PLA* u2 {& R* s9 r, J: M1 p/ P
STA ADDR_FROM_START
& N5 B" D$ K0 s: M" c( V* v$ |2 P PLA
9 z7 ~) ?' s9 ~, O+ V2 Z STA ADDR_DATA_TO+1
5 J3 b, c5 G0 V" r" b+ c; W PLA
: o4 ^; x$ ~8 w0 ?+ ]! z# [ STA ADDR_DATA_TO3 X' b0 J% W! L; X, Y) ^3 W& R
PLA7 `, M, y, u6 T) M& a0 p
TAY, V8 x" W) @  J) S% U9 T+ H2 n
PLA# _, O) w1 K+ t4 g8 E
TAX
3 |5 Z1 p, z  ]! h* B8 u& e+ v; i PLA0 m1 N% h6 r6 E
PLP" L4 v$ {1 w) g) x" P- }! i

! Q- v- l  B  f7 ~4 m , ^4 {( l: J( @' S. ]  G" E

4 }" ?6 k9 A4 @" A: d; n+ B7 D3 zDATA_COPY_RETURN:
2 k' n4 B2 c" X3 b% l. S9 m# W RTS; h$ @* B# g) D, H& y
- ~1 C* E& u6 \) U
.ORG $C056    ;精灵指令覆盖2 n7 {8 A: n9 Z3 b
JSR $FFB5, B+ P9 W+ {7 E5 B. [$ U

: Y1 i1 k# n3 N" z7 ? .ORG $FFB5    ;; g3 o9 o. k( L' U( I
PHA2 @/ Z! }9 V  U% P
  TXA
4 W  q" w- f+ S( T: o) ]' w! L$ v PHA
, [  ?: R0 n( t4 @' M TYA
, K4 r, w2 m0 S1 w% i. W- |, z PHA
( k5 S+ F  U$ o1 ^. W LDA $71FF    ;比较7000-71FE数据是否完成复制
. b, }0 q0 B7 u9 M& | CMP #$FE+ s% R5 O7 J: E; Z  x% f1 X
BNE ADDR_FFCA
2 D  l1 H  b0 N0 \: z# g3 g( D PLA
3 x; U; c0 N2 [7 }5 g  h! P TAY
( g* ]3 d5 W: l( ^( H; @ PLA8 {# i: ]/ T& e3 \
TAX
* `+ p, m& z, L/ }- `$ h8 V PLA
3 p8 _( }! i/ R+ ]) x+ x JSR $7000   ;跳转到自写程序, B, `( F. H  w8 m
RTS! ]" t$ l4 {* W& n! C% Y5 X
ADDR_FFCA:% W; O6 k, l# }) q! z7 u; A% L& U
PLA
, {6 I% A+ @2 [6 } TAY
+ ^" _* `- F' f9 ~ PLA6 ?9 `$ v: m, i. w
TAX
7 z2 a# @7 k5 ~" I PLA
8 c' h5 P" ]5 `+ z6 I0 E$ E3 U0 y RTS
2 Z" K& }5 ^7 B
7 b* g, e  A/ d/ a! y) O& A' I# M; H- N& ^+ v) @$ Y' \: j8 D

% v; ]& e7 N, m1 Y .ORG $C264    ;自定义的MAPPER2切页程序( H8 l7 O7 H+ O/ I3 M9 d$ b: ]
PHA3 v% G$ }3 V/ B# F# I$ s
TXA6 ^  t$ X% L1 D% G0 v
PHA! C% U- m, q* _1 t$ R
LDA $0066
7 ^  ~! @) ]& F( @ BNE ADDRC280
& F1 ~. V9 j9 y7 l) g* z: i5 i LDA #$074 M% u+ G, T1 ~7 i1 o9 y9 y
LDX #$03( Y; C) O9 }, t
JSR $CD9B    ;自带的切bank方法
: i, [( ]5 N, s4 i PLA+ m; h5 y0 P5 S/ `
TAX% Y& I9 R& u) `, {2 ?! Q& ^
PLA
  a$ l! n) _. k7 Y JSR $8000& n8 n  o1 |3 j" Y* Y
LDA #$06. v- n  ]3 W0 ?. p! I
LDX #$03
1 ^1 N3 J; F- \- i" `0 U JSR $CD9B    ;切回原该切得bank(可以不用)
" I0 M; N9 O7 n; z+ ~1 S RTS: l4 x5 I1 M1 a; `7 A+ I
ADDRC280:% u1 P8 L* A2 M" Z/ T
PLA& u. Q) z2 G: z8 j
TAX% a9 \/ q& F! F, [) M4 {9 d& i: x
PLA
2 v$ |. K& `7 m9 i; R. @( L& v RTS
" `7 P( C# h! @ . C6 O$ N9 f0 u6 T2 [; A
1 l! t1 b0 P3 ]% w3 _: t( ~& a% h
;[FC][最终任务PPU][END]/ a: G: R1 s+ g0 I, I& Y* ?
.ORG $C056    ;跳转到PPU重写程序
3 N3 ~6 U0 m/ ]# j4 t JSR $70001 d* c$ P7 a5 {" k, @7 e; P' O

$ b. D6 O  L% c% W. C .ORG $CEBF
$ ~$ T. S8 r3 V9 Q) y# V$ W JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
8 z. v$ l: z. r" M4 `' x0 L! a  7 K/ _1 i! t/ f2 t  q/ ?+ O
  .ORG $E4609 x, ~# A" _! r" O$ ^
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
) r# |+ s# ]: e$ Q3 Z  
3 D0 U- e  F3 p3 ~& v .ORG $71F0% k8 M$ C* t. g
STAGE_DATA_WRITE:+ v$ z6 w% |% u* n" F' W
  LDA $6010
( r4 o* `* b+ k, C6 |4 m$ N0 k( t  STA $1E    ;关卡写入
9 X# S# I: M; K  @8 w4 ^  LDA #$00
; U8 r/ K: S0 z$ c- |" M  RTS
5 |: a4 N5 W4 Y1 u7 ^ .ORG $71C0
# _0 L; P4 C' Q- B! i+ ?% RBULLET_DATA_WRITE:    ;副武器数据写入
7 F2 q% |* \+ l( @; I) Y CPX #$0E/ z2 z  O1 v, w1 J
BCS P2_BUL
1 i4 b7 s; y1 V5 v+ U' ]8 WP1_BUL:
! c# l! J# g5 U# {- x/ T LDA $6004  v* v* m. \- T3 t3 C. N
JSR $D7D0    ;P1副武器数据写入
' a- Y) t2 [( N* a% `7 x RTS, y" F, X& q! n5 P5 e% V: q
P2_BUL:5 M2 |! |( ]5 e- n- [% p
LDA $60055 E) c) m! y* W3 D2 [* P
JSR $D7D0    ;P2副武器数据写入
$ I, N8 }# C  Q, j8 |1 X/ _ RTS8 d! L+ D+ Z" n4 x) _+ f; {
$ }! n7 [6 F+ k/ h
/ ?. y9 Z5 R. e& h, d3 J
.ORG $70003 |; Y; j( W8 ~( O1 I
  
! v- M4 v& d! N& s STY $4014    ;补上覆盖的精灵写入指令
: l- I7 `! r; `- { PHA
% P) O, ]: e3 Z' Z) I TXA- V, H5 A7 b$ d; F" i4 M
PHA
7 e; ^8 }+ ]+ M  n# f) h4 u TYA4 W0 A4 i9 z+ F# c8 D/ f
PHA
# a  S+ t3 k4 y* B: o6 ?  t LDA $0C. G7 f0 d" ]2 j
CMP #$01    ;比较是否为标题画面
& o7 H4 C  q0 D$ B: p) P BEQ PPU_STAGE6 Y* B1 r- |* ?1 t5 x# o
PLA
6 i& F. e3 {4 k& w$ a& g TAY
# z( c' j4 A/ O. }# p8 { PLA7 I7 p6 K8 F& R
TAX
4 |% \. |2 m' u/ N PLA
" t( B9 \9 {* X# S8 t" H1 b3 K RTS
3 b, k! r6 V% c" \PPU_STAGE:    ;STAGE显示程序/ Z' S$ r/ U0 q% a8 V6 u
LDA PPU_ADDR_DATA
* L% k0 U9 S$ w, p( \. X. T( J STA $2006
7 Q; a' H- I; ^ LDA PPU_ADDR_DATA+1
* r- O6 b$ T# @% Q* V1 { STA $2006    ;坐标设置  o! Y* L3 ^+ T$ i6 O: V% L- h
LDX #$00
1 c. Q+ h6 O( \: Z7 H- ZPPU_STAGE_WROTE:    ;写入STAGE字模$ O) ?0 I$ j& b- Y  s* n# Q! [
LDA STAGE_DATA,X
* r' S2 b: n' |+ w9 `6 w9 {7 `2 ]9 K STA $2007
( l/ s* y- s8 M7 |$ Q INX
& ~) J! i* @' f  @" W CPX #$06. z3 x6 D, z4 O7 y* \6 M$ Z1 j6 F
BCC PPU_STAGE_WROTE  n" x4 ~1 e, l# h( h) \& `! x6 ]
LDA $6010
! G, U0 r, f3 p/ ? CMP #$FF    ;关卡数据初始化条件判断
' h" p! H" ~1 W# z1 q" |! Z& B BNE KEY_B2 i* e/ U4 G) p) v2 S3 z
LDA #$00, u9 I0 o. e7 y6 N1 b  T- L/ O
STA $6010    ;关卡数据初始化
) h5 Q( V* ^0 d7 L8 a* YKEY_B:    ;关卡减少
/ i/ L& C  K) q& B8 c$ y$ A LDA $04
% f* }; E% U* P0 o AND #$42    ;按键B或左减关
3 I6 P: j# z9 ^) Y BEQ KEY_A1 J3 z- k$ `' D1 `" R4 g6 T
LDA $6010
! w1 N9 A, R9 o- F9 [, R CMP #$00    ;关卡比较
( O) x, z* z3 s5 a BEQ KEY_A7 j3 i$ H' Q- N' I0 m% B; y
DEC $6010   ;减关+ @6 w) Y8 X  U2 u# Q& \0 @/ W
KEY_A:    ;关卡增加
5 a! X9 M* V- K# ~( X# t! E' q LDA $04
- ]4 o, i" W; @/ \7 q# \4 z) o% y AND #$81    ;按键A或右加关
/ y# O; M" B9 k# u/ Q BEQ PPU_NUM_WRITE8 E# ]7 U, K0 t* e# M$ ^
LDA $6010
+ @. L" {) `- d% g9 E CMP #$04    ;关卡比较$ L! h: |+ B4 ~7 t! z* r
BEQ PPU_NUM_WRITE% V9 v. e; N. Z
INC $6010    ;加关
2 w2 \+ n6 r3 ~- _PPU_NUM_WRITE:0 H$ `& i- n, r5 N/ r) P
LDA $6010# d3 V# @4 U6 a* j# X
TAX- u# A) V8 Q: r# w& k/ V) g
LDA STAGE_NUM,X    ;写入数字+ i' ~4 Z/ ~$ x
STA $2007
+ w6 V' \8 f8 C4 l. \- I. f  oPPU_RTS:: b( s5 u( D: m& c3 S3 K8 }
PLA
9 j7 O" i4 i+ g& O7 ~ TAY
- l: o: c6 A* T9 g PLA
8 v0 U* _( Y+ p; `4 i: s! V. F TAX
  M6 ?+ A* [0 W  O PLA
. h6 E9 v, O( |4 U7 ~  h. w6 ? RTS5 C' G2 x4 _, u; c- q; n7 T* ^

' z! _$ J* i3 w5 i& Z- g2 J+ ?6 t" P
: a  L" v2 g" E, n. F6 Y$ [STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据
2 K$ a* t; h$ D% x3 \" Y; ~ .BYTE $EC,$ED,$DA,$E0,$DE,00
9 k1 l  I3 m9 L+ T0 USTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据; V8 J  t( R: N
.BYTE $D1,$D2,$D3,$D4,$D5
7 H% Q8 F4 e: N- F 0 h+ _  n" E0 Y1 A: Q9 m" ~
PPU_ADDR_DATA:
6 L7 t( r9 s. i$ w+ y- J7 I" `6 m .BYTE $23,$0C
9 l- ~1 i. P; F, g. l( d9 a. X
7 t* Q" b3 ~  |$ N3 j

本帖子中包含更多资源

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

×

签到天数: 179 天

[LV.7]常住居民III

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-26 17:19

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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