EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
8 A9 a. `' S. m* ~% e. T0 [# s  Q0 {8 k5 g4 e; z
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
3 Y- m+ @7 p; }7 ^- e5 L然而,今天想到一个思路.( ]( W! C* y0 l+ j
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
. P3 Q( O# d) N# Q3 p# G2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE7 q( R' x. |4 T6 M6 Y- P
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
+ k; w5 `& ?) [7 Z  }, X9 W6 E
9 f2 ~; u8 v) l  C0 L4 @2 }! Q7 X2 k9 v  n5 K; G2 A# |! t+ y
;[FC][最终任务KEY][END]
1 N/ ?# J- v2 K' C2 z+ kbutton = $04    ;单次按键
( U0 B, W$ H7 i8 Tflag = $6000    ;功能开关标志
6 c* y& f+ q( ^pause = $000E   ;暂停地址
/ b6 f) a6 u- d. R+ G- G5 k5 h
! V. I9 O* F1 q0 w, O' C .ORG $80009 v7 h* Q/ M& r, b  `. h5 A9 V
LDY #$08    ;自带的按键程序: I2 r* V5 P( u6 t4 t
ADDR8002:
7 ^) ?8 i/ U. ^1 K LDA $4016,X: ~# j8 @- ]- i) w/ T7 O9 N
LSR. ?6 k+ c7 a( N9 t
ROL $0021
5 M' x1 a8 E  ~, F LSR
, K) h8 t, U+ X2 o% p ROL $0029
5 L+ v/ D8 C7 I  L5 e! b DEY
# z! J% J! }9 P3 F5 L% ? BNE $8002
) _& v! L6 o% `. \2 A LDA $0021
7 ?5 y+ T9 c$ s2 e, q$ c2 ], m ORA $0029
) O% A+ @+ S5 |* e$ i$ x0 p STA $0021  h+ [% m0 d5 X
LDA $0020. s/ V! K+ @2 S2 Q5 \* Z5 g8 o
AND $00210 n, `6 K) E% J2 T
STA $0020! N, v5 f% k. w3 P8 D
LDA $06,X
2 Q7 Y1 [  g( a- R EOR $0020
& v, W) i/ ~+ k3 v AND $00206 E, d+ a7 t- t4 T9 `8 r
STA $04,X
4 T! y: P4 E4 Y LDA $0020
) t; N# M8 ^$ n& Q7 @5 p, ^9 O STA $06,X- U& d. I" I+ O; h6 H7 `$ A, S6 M
JSR KEY_OPERATE* d7 ~' ?$ V  I, W& z; Q' k8 p, K
JSR Function    ;功能调用7 b7 e% L7 K* I# `
JSR Weapon    ;武器切换调用  r0 z( ?5 R! t- x1 @1 G/ ~8 V
JSR Power    ;威力调用
/ E' L/ Q6 S7 I) C, P6 O JSR BULLET_NUM    ;子弹数目2 s+ [9 U) F! F' S- i4 x, X
JSR BULLET    ;副武器类型
6 e# f" B& w: W. V# Q6 E/ w2 h4 G RTS8 H  X  U" A0 R6 {8 _% C* A

# o6 C& o+ z' A3 A; Z
  O8 b5 \# V3 R/ D
' ^6 S5 s( b& K4 Y6 W( G6 a .ORG $8050
& X; {8 g0 \0 k" J& V5 U' z5 PFunction:    ;功能2 _! n. e2 k1 ?; P. L6 Q
WUDI:    ;无敌
) D( ?. [; n* N0 n$ b, x LDA $6000,X
1 [, F7 i: @/ j  V AND #$08    ;开关判断
& q, j# Q3 M+ X# I- j  t BEQ LIFE5 y7 x% o3 O) w6 g
LDA #$05
) W/ y% j0 w4 d& e  E# s/ r- n8 n STA $05DC,X    ;无敌锁定& p  ]! L: b7 z* m( h) L6 z
LIFE:    ;生命/ [9 Z. z: F' Q$ f- s. Z" E
LDA $6000,X+ b. q, e) v  K# M
AND #$04    ;开关判断
( G% s8 P; V6 l# x) ~# | BEQ FUNRTS: _: O: {) k9 \  _; L  `; p# q
LDA #$05
& v; N3 X: B# D" o STA $1C,X    ;生命赋值
& x/ Q2 y6 b* W9 |! D: r% o/ i5 L' \$ pFUNRTS:% d1 B/ l0 p& Q
RTS
: X! r5 k1 N; P+ J- T3 D. G8 s' r - ~/ S9 |1 W" }  f1 b
Weapon:    ;武器切换
3 A- d( F9 W  s LDA pause    ;暂停状态判断
7 Z2 |: H$ M# n, t' Y BNE WEARTS
9 u( T: n4 P& Y  c0 Y. g. J( j" e2 y1 o. H  m LDA $04,X
' u$ \5 v: N3 H* ?1 I8 Q CMP #$20    ;选择键判断2 N: p6 }" L+ o) A% O0 @( E
BNE WEARTS+ [! s+ u% _. H: T5 [3 y
LDA $12,X
# d9 W4 J. Y( }* F# u9 Z! h CMP #$03    ;武器值判断( i" f5 t2 m, M& p1 I, m
BCC WEAINC
. g# c, G4 ^* i" n# y6 C) ?0 x LDA #$FF
6 W& R7 T4 H/ A% I STA $12,X    ;武器重置
0 _& ]" s% v. v$ DWEAINC:% q% V4 _/ s1 Z: z) B
INC $12,X    ;武器增加. ?% R, l0 W6 n5 M

6 b5 o" |& Y$ `" g+ Q4 ^3 ~WEARTS:& @" R- Z" W7 H/ F6 g
RTS- q6 _1 f+ N1 S$ t

. R" a7 k! M/ m' i+ K, l2 @: dPower:    ;威力
6 P6 F7 s" p5 q) D/ M- X5 ]  h LDA pause    ;暂停状态判断
2 a' r/ Q* R1 R BEQ SPERTS; F  g+ a6 A5 E: p
BUT_LEFT:0 }- P6 n0 I: \4 ]: I5 |$ R
LDA $04,X
1 S% o- C6 c  d8 u% A CMP #$02    ;左按键判断
& u5 C- V. y! O5 C- P- F BNE BUT_RIGHT5 Q/ o( V) F: j' T/ Y  U" x
LDA $88,X& I( Y0 F! T' M7 m/ E
CMP #$00    ;威力判断
" i: Y6 Y$ R9 }* f1 [8 c BEQ SPERTS
5 ?" W7 F2 k9 QSPEDEC0 ~- {% `8 U$ w9 L" w9 G  {
LDA $88,X    ;读取武器值1 x9 b. A% W+ T$ j# l$ f
SEC0 X" x' ~1 o  ^4 w9 B  W- S6 \7 c
SBC #$08
5 D( D4 o* l2 n STA $88,X    ;威力减小6 U9 h4 \2 G0 C% J; ]1 E8 I
BUT_RIGHT:3 \& i* {  P  {4 T( G7 Y' v( y
LDA $04,X
$ f; x( |3 j: c8 B. d CMP #$01    ;右按键判断
% K8 ]8 m. U$ ?4 z BNE SPERTS$ y) g% q  @5 w- k+ m* Q7 q
LDA $88,X: N2 m0 J7 K* Z& o
CMP #$10    ;威力判断$ W7 C  N$ w+ J  a3 @
BEQ SPERTS; ^6 A& J  {, i, ?, R8 D
SPEINC:  J6 m7 S# t" Q8 f
LDA $88,X    ;读取武器值- p$ j& J# \4 U' p8 J9 q' h
CLC" C5 w# w+ }* M& M7 W& b
ADC #$08* N4 j5 ~% d3 u( Z  q+ X( u# o
STA $88,X    ;威力增大) K% X# q1 B1 M

; A! p. S  P- N/ a) eSPERTS:
; x2 ]& D8 I8 H' X' J/ d RTS; q# i: m, {, _' y

, B" k, `/ ^) h: d9 v* qBULLET_NUM:    ;子弹数目- W6 \/ _) D: d2 w6 u0 u% ]# b% T( O
LDA pause    ;暂停状态判断, q( n; u, @$ \5 Y9 p. p2 _6 @
BEQ BULRTS/ e4 g* G  Q6 ?8 E$ G; p
CPX #$00    ;主机玩家判断5 x$ m& t5 r$ ^4 E
BNE BULRTS
+ z6 c  C9 d, t; z5 P0 l% P LDA $04,X    ;主机玩家判断
3 ?: V. R" I: r- ^ AND #$80    ;按键A比较
' i' L( Z5 k. D6 B BEQ BULRTS
$ N, E, w# h! `2 D6 l- |/ a% W  E( s$ A LDA $87    ;状态判断4 b; ?4 d4 w& z2 }7 u1 a
BEQ BUL_2
! G+ I( ]% _; R5 }1 TBUL_1:% l8 [, @, S- i9 T" N* r7 \
LDA #$00
7 C+ _" _( l2 U  z2 M STA $87    ;1发子弹3 x# Y8 m. j/ V. N9 \  p
BEQ BULRTS' ]9 }: y) d2 k. Y2 k
BUL_2:5 B4 f% f0 B$ P  @* Y
LDA #$01# H. `9 L/ ~$ J) d
STA $87    ;2发子弹
# e0 V# t! A/ C4 X( Y8 c  V 2 k2 s) t7 ^5 d( k5 U# Y
BULRTS:
# U3 z" F2 b( B/ T7 N% F RTS1 I- A( r; c  L8 R2 g5 k; p. U

: N" O& }! S0 F( n2 @! K+ \1 Q! n
( U- u: L& M. `1 Z1 t6 B' o+ KBULLET:
4 c" z3 i( S" O/ _0 L4 t LDA pause    ;判断暂停状态
5 F, o( r! h% W6 c BEQ BULLETRTS) j0 J: a# J6 w4 T+ E# _
LDA $04,X# g# Z; c" j1 r; v) t$ n2 @3 J! ]* l
CMP #$40    ;按键B比较% Y" D3 N% z0 [& Y9 V. H/ P
BNE BULLETRTS
) J- j# T0 x# z7 N LDA $6002,X    ;读取副武器
/ \# p' x4 c# a2 x- s CMP #$034 b' z8 P5 ?% S; H
BCC BULLETADD
6 P- q7 |$ n. {. T. L5 T- m LDA #$FF; l: ?$ Z7 {9 P% |+ `5 C
STA $6002,X/ H. p* C8 c+ l' Q
BULLETADD:' Z+ M) R- c( x3 @. `1 k' [
INC $6002,X% T2 ^% y) S4 P. a

. S! \: F# O8 Y4 m0 a( n: v  \BULLETRTS:2 y8 H/ m5 W1 Q# p$ I( _! d
LDA $6002,X
  \2 s6 ^: w; b+ o TAY
% Y' Z( x# ]) }/ G, p! J LDA BULLET_DATA,Y
$ N; k  G+ m; x5 O' |" O( R STA $6004,X    ;写入副武器数据9 D% q1 m9 o9 [7 ^3 E  g
RTS5 E8 L  r1 m# m7 e+ {& h/ p

* g: ]4 a$ P2 l( g0 j. A 6 l+ E; T) L* |9 ?* V7 T7 a
BULLET_DATA:& U  P1 u- e! Z+ ?
.BYTE $06,$02,$03,$04( {# b2 X3 m$ P# S6 V0 S7 ^- G

" c! R  s$ _! l; W8 r7 f 7 ^) g7 P0 ?0 |  ], }. Y4 p- ~0 ?

  \( i) M6 t0 h" p2 \/ tKEY_OPERATE:    ;按键开关操作
: ?, E) y5 t$ d0 ?2 m8 ~data_protect:    ;数据保护
4 s7 ]0 z# [7 t9 u6 } PHA
8 [0 ]5 w8 k/ P  i  {# } TXA
6 ^$ Y$ p6 ]! Q8 N- i  g PHA  [. J7 P; T4 x2 _
TYA1 ^1 Q; m4 ?7 o$ d  r
PHA
0 k0 l3 P. B) i+ z* o# g. v* e* r5 L6 R2 E4 ?
FLAG_INI:    ;开关标志初始化* R9 ~* i( Y* \9 R+ V% s
0 p4 l( X+ @7 J! N4 b: }. Y8 r
LDA $600F! e1 K. p7 S% `9 o) D+ m( F
CMP #$011 P2 b0 E+ R& d1 t" F3 i- w, z, }
BEQ pause_cmp
4 `* o  y+ H: C# i8 V. m. ~ LDA #$00+ j' p* W4 B6 I  |
STA $6000
% ]7 M6 o' g/ S' _( S STA $6001& @5 {3 {# i0 ~. |7 z- W
STA $6002+ k. W3 E: e" p* d. D. }& X
STA $6003+ J" p. o+ b4 n: J% p
STA $60040 h0 A7 ^3 S& F9 w7 W
STA $6005# F) G/ y2 |: O1 i5 J& q  r
LDA #$01
# L) c. U2 L7 U6 B) t" l  t% K  | STA $600F% p: k/ {$ o$ U8 e* Z1 J, r0 g
# e8 N& X- ]/ Z. _- B
pause_cmp:    ;判断暂停状态. ~3 ~9 U; h  ~# L
LDA pause
! v* E$ U: r0 b3 G- b7 i) c# k/ q8 i CMP #$01    ;判断暂停状态
! T& j. q( L, k+ R& @# E BEQ button_press; P6 }2 q2 f8 [0 M& S( i1 X
PLA' C4 `! |; b0 F, _5 h
TAY
) n7 h. k3 ^4 ]6 d' \ PLA+ ^& [  x" z9 {% e
TAX% j" X& e7 b- c7 x
PLA
  C$ x  h" L3 C# l RTS/ d2 R3 Y2 b! i
0 F% f' Q* u' L4 Z, D! d4 i. y
button_press:    ;按压操作
( e& i, o0 N' ]: T/ _ini_Y:- J1 x6 t6 j3 q: Q1 r& n3 O
LDY #$00( v% J) L* F& _* ~; V
button_cmp:
- L5 ?6 `# B1 t: H! w5 `/ c LDA button,X
* N8 h0 i1 W9 v9 e  U9 ?6 {! A CMP ora_data,Y7 V5 K8 z) H& r: S. {" Q" x$ ~
BNE count_Y_cmp! H5 V5 t0 u. j6 ?9 n5 y
flag_cmp:4 H& ^- M# I- b, `
LDA flag,X) }; s4 U* z, T5 f6 a2 B5 H4 g. D
AND ora_data,Y$ U0 _% {. d9 L
BNE flag_and
2 w1 J! `" f: p/ }/ D  mflag_ora:' v4 s" k) t% m* J' Q; D
LDA flag,X- [) E. m4 |0 b1 S  t2 V; d1 A5 X1 e
ORA ora_data,Y6 b5 \) j5 D' f4 J* _* C* x$ p
STA flag,X* o7 _% `& \4 V) D4 U
BNE count_Y_cmp
! U3 G$ G$ f! J% h& W8 s1 J( _# Pflag_and:5 d& s: ^$ f. O
LDA flag,X7 V7 j! @' x! N1 O( I% G  C+ ]
AND and_data,Y
$ @, i# E  m" p2 V STA flag,X
3 E2 }( Z. H1 ]' \, }; Icount_Y_cmp:
( e  m2 E1 N0 ?$ [) A INY5 n. k9 i  Q, c
CPY #$08: _) ^# u$ ?3 D
BCC button_cmp& s1 `# V+ u" R; K; Y/ t& s

* u; i: I; N! j3 c& T( [& ^data_extract:    ;数据恢复
$ m+ q) I2 ^2 f4 R* M+ A PLA
# \0 ?7 d& x) P4 A. o& S TAY8 A3 m( Q' @- d" h' D
PLA
5 f6 L% Y: n8 E2 K TAX: o5 ^7 x) I/ Z; {. ]/ U5 B
PLA
& b) n$ P. [1 Q5 s% y, u$ Y, ]% r
# v0 a  E# R( i# r" w+ U, |8 preturn:
1 ?: W* e$ p! J! ^3 p1 y RTS
' L0 Y: d2 O7 n& V8 Y% f0 T3 f5 h 0 d5 ^$ \) }, M2 r  N7 m
ora_data:   ;按键相或数据3 N, J: Y9 t. q" k7 y. t. O$ U. d
.BYTE $08,$04,$02,$01,$80,$40,$20,$108 Y8 v8 {* c+ I( \$ r! F
and_data:   ;按键相与数据
, v  j0 @1 [) K3 n9 a0 T7 N .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
: Q5 l& y# q' O5 A6 s. {, P8 L . l0 k% D# }4 S
/ F: G0 v/ F: l4 }: S# G0 G

+ N; R6 F. g+ I8 d5 F" q0 c1 G ;FC数据搬移程序 BY FlameCyclone
4 X% o* l! ~+ F .ORG $8200
$ x' f& F0 |' |! _& U JMP DATA_COPY_PROTECT
' w, U4 P8 h  P. ?
+ B; x# Q5 C3 `ADDR_DATA_TO = $40    ;目的地址
1 {4 W( q0 N  u0 A1 M& `ADDR_FROM_START = $42    ;源开始地址' l* f- g5 q: W$ C0 T
ADDR_FROM_END = $44    ;源结束地址. i( U5 o/ W' b4 V# t$ E$ ^4 |

% W$ ?; c4 `5 M; s1 kADDR_TO:    ;目的地址
; n8 T6 A) U: z+ }9 W. h .BYTE $00,$70* f. U; f  V. B; C. H8 e. o- |
ADDR_BEGIN:    ;源开始地址" x2 r7 a" f% t5 j6 M
.BYTE $00,$83( d7 w3 f# i' B- Y$ ^/ @1 j
ADDR_END:    ;源结束地址5 e2 h- b; a# X& T" s, `! H5 J* H
.BYTE $FE,$84
+ r) m* O  e$ P) [7 R$ S
+ P. E' w5 Z& N1 h% J- R+ `! mINT_ADDR = $08    ;中断地址; k" n* X8 ~+ D: L0 n( Z
FLAG_OVER = $71FF    ;完成标志7 V, q; T) d( L# x

) l/ e) J6 f1 V: I+ Q* W
4 [# I2 I/ T# i$ ADATA_COPY_PROTECT:    ;保护数据
9 D. U4 O# C8 L1 m4 ]9 o# e( @: N+ h PHP/ u3 G2 ?6 l. e5 B$ v
PHA$ R. w4 L& s& _" V; d) {( b, G
TXA0 q4 G6 j- j) z1 T, S4 ?4 m
PHA
# h- x* t  |& s* L TYA
" `" I$ c! {, K, r, P. I* ` PHA
3 ^, I- N0 c! I. x0 t: V LDA ADDR_DATA_TO
" P" o' t- r1 |4 A3 M PHA/ S, g' `- y  ]
LDA ADDR_DATA_TO+1
, `& e. b2 N8 u' x# F3 ^/ }! n. T! I PHA
5 k, M0 t  R7 s/ [$ g5 W LDA ADDR_FROM_START2 w0 S# |! \5 P+ h  D$ r$ }
PHA/ ?9 O/ B, G+ s# H1 V5 {
LDA ADDR_FROM_START+1/ w1 Z* R. p; a5 ?
PHA( f. `2 f- z4 v+ t9 z
LDA ADDR_FROM_END; B( a, K' {2 w' J' I
PHA
( Y6 B7 f1 c# a9 \ LDA ADDR_FROM_END+1
) U% m8 E7 `. u6 E" q; f# Y PHA
/ N; \7 z: `! D1 m3 b ' r* o3 T+ w  h( }
OFF_INT:   ;屏蔽中断
/ P  X- j, m) a3 F( D+ w  g LDA INT_ADDR
/ y6 D4 q: L  V4 X; I AND #$7F5 y. p7 n1 f# S& t, B
STA $2000    ;屏蔽中断
5 w' Z6 i/ e0 r6 n% p! Z; q" E
+ r6 w3 V# g: D* z) l! d! a5 S" \
5 M8 w  r9 B4 j/ N( u/ lSET_DATA_ADDR_START:    ;设置复制起始地址
% D" t* W( x. c6 e% {1 o3 | LDA ADDR_BEGIN4 ^8 B1 R+ l; h8 X
STA ADDR_FROM_START    ;设置复制起始地址低位4 a; v, g% J: S8 _; \1 O" {
LDA ADDR_BEGIN+1# I% \$ H8 R. Q% `' j6 f
STA ADDR_FROM_START+1    ;设置复制起始地址高位
* O+ x6 l% }4 E( t/ C- n" [
7 g% ^  Z9 a  k. Y- W8 o+ tSET_DATA_ADDR_END:    ;设置复制结束地址/ \# i. C# b) w4 H9 x: w
LDA ADDR_END2 D: w% O6 n; D$ Z$ D) p
STA ADDR_FROM_END    ;设置复制结束地址低位  v4 ]* p. s/ U3 |  U3 E% [- g
LDA ADDR_END+1. u0 x) u  c- N$ e! w( t
STA ADDR_FROM_END+1    ;设置复制结束地址高位: ]2 A( I9 B' f# X( G
! V+ R7 j8 g* _
SET_DATA_COPY_START:   ;设置目的起始地址& q' C/ r' N0 ]7 H: |. G
LDA ADDR_TO
3 x9 S/ m" d/ U0 J STA ADDR_DATA_TO   ;设置目的起始地址低位
+ V) _' ]1 P& _0 R6 V3 q  u5 u4 u LDA ADDR_TO+16 U) m! `' X3 ~* G
STA ADDR_DATA_TO+1   ;设置目的起始地址高位9 Z% r0 B! T* ~  P; M

" G4 n5 p9 l7 v0 VOVER_COPY_CMP:    ;复制完成比较, T+ c3 _7 a6 W- n
LDA FLAG_OVER
4 N% ^3 t/ d/ u) K CMP #$FE    ;复制完成标志比较
' F  r) [1 V# C3 q- D' R7 n# E BEQ DATA_COPY_EXACT
9 f  n+ \4 J" g8 u! L, J# x8 ?8 p2 a, s) N; N9 c# k
INI_XY_COUNT:   ;计数器初始化& V0 @# y6 L8 M& D
LDX #$00
. F4 H! ~6 ^0 w7 f: t LDY #$00
' e7 z% @5 G9 y- F8 T  s6 W
2 e0 V/ f* @5 UCOPY_OVER_CMP:    ;地址比较% }3 [8 p  Y8 A& K9 b
LDA ADDR_FROM_START: _1 @3 w: ~$ i4 m' y2 t! x* s$ s! A
CMP ADDR_FROM_END
& v7 c# z: a' J! f: g BNE COPY_START
# E0 ], L2 g. i0 [. i LDA ADDR_FROM_START+12 }/ r/ @- x) N
CMP ADDR_FROM_END+1
- j) i, S7 Y" X! E- G BEQ COPY_OVER$ r; B, {2 V( A
% F& c! U0 u* Z4 f. n
COPY_START:    ;数据复制开始5 y9 t+ p9 V* G4 G
LDA (ADDR_FROM_START),Y    ;读取源地址
' N( p, w; L) k; E/ R  R; E STA (ADDR_DATA_TO),Y    ;写入目的地址) a3 h1 }3 f( d( q" ^* A3 a' [
INC ADDR_FROM_START   ;源地址低位递增
7 g- t$ L  @" H% x1 F9 s# k! Q INC ADDR_DATA_TO   ;目的地址低位递增0 U$ |' L! f% g( G8 `( _0 A
BNE COPY_JMP
$ }% O3 I. B' i2 H- a INC ADDR_FROM_START+1   ;源地址高位递增* l4 w; A3 ?! b' H$ V
INC ADDR_DATA_TO+1   ;目的地址高位递增* G* W- u9 _( L' t) X1 Z% c1 u5 k
. q# L$ p$ K! u/ m! i7 V+ q5 q" k
COPY_JMP:    2 g3 F6 \4 f( R  l5 }
JMP COPY_OVER_CMP
6 \/ Y- ^) [  b9 P% o' D6 p9 O" c$ k+ M" @
COPY_OVER:    ;复制完成
0 S+ d3 Z) z7 s$ P; G; n LDA #$FE
. p1 {  B+ R& w4 i, O1 u# }. L STA FLAG_OVER    ;写入完成标志. p- C3 v. A/ E& Z( O% Z8 \
FINAL_BYTE:' C9 K5 Z0 s, J! Z- r
LDA (ADDR_FROM_START),Y    ;读取最后一个字节
' x2 x8 M. a6 W0 A8 G STA (ADDR_DATA_TO),Y    ;写入最后一个字节
) M' f) O% X* t: \7 U5 t2 N) C# n
- V/ q/ g6 d  G( c& D8 _DATA_COPY_EXACT:    ;恢复数据8 J2 b  \0 L+ Q' \- r
LDA INT_ADDR  n' g5 f8 j' C) y- l+ g8 o' z
STA $2000    ;恢复中断
2 p& ], ~' l$ c6 Y8 p& K PLA
; p% A0 c$ U. O9 T( h STA ADDR_FROM_END+1
. D/ J# S, T1 G3 C PLA
  t* r9 Z$ }1 D$ ~ STA ADDR_FROM_END( u/ w& I9 M# p5 B& a9 v, W
PLA; o' M' n5 d+ q2 E2 v% B& E1 c/ R
STA ADDR_FROM_START+1: d1 e- Q6 q$ }. }4 R5 ?! s
PLA
# h; e4 g# Q- L+ Q3 G STA ADDR_FROM_START6 F8 H* o$ V( F3 J5 c7 }8 Q
PLA
) w- E0 V: [' v3 g5 m# s/ k& m STA ADDR_DATA_TO+1) D% \$ j9 S+ X2 T# p
PLA: A# h1 E0 V$ k  m3 E
STA ADDR_DATA_TO6 O3 a" s: A6 x( y" z9 L' G  a
PLA0 G% R+ @# h6 y' n* |
TAY0 y+ W: D3 b, M" u
PLA
. D/ @0 m, N) ^- Q/ J TAX1 j( b5 Z6 Z. N( o* `; f3 l
PLA: A0 z. a3 D6 d( Z6 m
PLP% H( H! G  p8 o9 d( G
/ R3 [' e+ `2 y1 N

: z3 a' P# C) y" g- y7 ~+ t
2 L5 c* B' t, U, b* P6 O/ {2 WDATA_COPY_RETURN:
+ D/ q& ^! Q7 i( U4 {9 E RTS2 Z, r* o0 m* \& A2 R& G4 ?4 h

* X+ Z8 j& f6 p  b( k# Y. m! n .ORG $C056    ;精灵指令覆盖
+ h$ z% ?: m2 ~# {  t1 a& C JSR $FFB5
, f& R6 [- A# d  O: D# w$ T( P  L
4 |; R4 U# I/ Y+ m3 i) t- } .ORG $FFB5    ;: t3 M8 |$ _5 g7 _, }
PHA
- r4 h7 G' m( _% r) C' _  TXA% N! T' m: R8 `( F$ q. R3 C+ y- Y
PHA
" j2 T0 T8 G  ~* L8 [0 H6 v# t TYA3 Y6 O+ X' m" y; U
PHA
6 K0 _. x2 `3 n; H: L- U LDA $71FF    ;比较7000-71FE数据是否完成复制2 p) r3 l+ n- v
CMP #$FE" L9 j. g2 y0 S$ }
BNE ADDR_FFCA2 ]  X- h. D; r' i" C8 v# M) \
PLA/ G6 E  w% N# Z1 Y9 w! h
TAY! r/ Y+ a1 Q5 _
PLA
! P) H( Z$ I% f; y9 c! H TAX# F6 o2 h" r; n& Y7 M; A( N4 @
PLA: A' O" E! \6 h( x: h
JSR $7000   ;跳转到自写程序3 \8 M% H5 {3 L% j
RTS, t7 \* H/ J: b8 ]5 y
ADDR_FFCA:
$ I4 \4 ^* b; v  |: R4 v& P PLA- P" g6 g& G1 _; h, w* e
TAY- h3 h. ?1 I: Z/ k* o+ J
PLA" S: ~" y) f4 l2 S% M5 h0 B
TAX( }% g* K3 j% I3 O
PLA
7 K4 w% a( e6 B  @9 L$ y4 } RTS- [, e. a- i5 a2 S: J
3 w0 b. c8 M) k4 N# O" o4 o) j

" s3 y" h! j/ G3 i4 _( u" O/ E% n% i. ?9 d2 _* n" w! r4 G, F0 S
.ORG $C264    ;自定义的MAPPER2切页程序. B+ |) ?* J: y
PHA
. a$ a/ z) K8 h) E TXA# ~. B5 l6 t% ^% X* A
PHA
" v) ?3 s2 W0 w+ ^; D  M LDA $00668 R5 Q# Q& @- h/ m0 O/ b
BNE ADDRC280/ M$ W& W4 W9 r7 \% [# ]
LDA #$07/ R: s' t0 R' y
LDX #$03/ c; V! C# ]! `7 q
JSR $CD9B    ;自带的切bank方法
+ r2 T+ {9 N  `, Y% Q9 V$ p PLA
, F1 M* _# {: D: B& a TAX( v' I( _5 m& \1 n3 r. p1 o
PLA6 O# x, n6 `, B- M1 q
JSR $80001 l5 N; a' u# n- W
LDA #$06
, r" _# x3 n. }0 D7 M8 e3 V LDX #$031 f8 U* C9 U+ S7 C, G# |' p
JSR $CD9B    ;切回原该切得bank(可以不用)  ]2 P+ ]8 h: o! e
RTS
/ `* @) q' \3 [5 ?ADDRC280:
- j. X7 S& y, o& Q% x PLA
) u3 J' t) g* t3 B+ k. Z, b TAX0 o0 g4 F8 X  }# \8 _
PLA
1 Y( _. }6 u' I$ h4 ^ RTS
, W/ @; w" S5 R/ A4 }8 D- r; E( H
  v2 F7 }8 O+ Q; D9 w& _' T
7 H( H- t: \; R# [2 l;[FC][最终任务PPU][END]
$ G4 r4 ?. T. {, a( ` .ORG $C056    ;跳转到PPU重写程序
8 s! r9 y3 k1 Y5 c5 ^: ~7 t, m+ q1 x JSR $7000
4 K, M$ ^6 e/ N% }& m- y8 r2 Q* [* C! V8 D" g+ `* T. ]# Z
.ORG $CEBF
, W$ w- K" y: a5 O JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入$ J* \  L, E: V) N; X' I/ s* j
  0 t$ r% m# y' I, D
  .ORG $E460/ d* t6 S4 ]! p5 r
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入/ f( g) _: ~$ v- \/ L3 ]9 c
  % o$ I# v/ k" _
.ORG $71F0
- p3 }* R+ D5 b0 R& i. WSTAGE_DATA_WRITE:  `) S% x- D6 [7 q* W/ r1 c: W
  LDA $6010, @) R5 e* v+ ^5 N2 C
  STA $1E    ;关卡写入# H9 z1 e& k3 S8 l4 f
  LDA #$00
0 Q8 g: n+ f" p. V: U, T9 t$ l( m  RTS8 Y9 D2 q' h8 N+ C& C, w
.ORG $71C07 S1 k; ~3 X3 r! y8 _
BULLET_DATA_WRITE:    ;副武器数据写入7 e- V" z+ v5 d- E. c; G
CPX #$0E
7 e" s  q, S* C BCS P2_BUL
. A4 z' i2 J* D8 |4 d3 mP1_BUL:
" `4 N$ c! B$ w- u) f! H/ s LDA $6004! `0 O% I! `) H# j$ k
JSR $D7D0    ;P1副武器数据写入
. s. y* z: r% X* d& a4 N- _& v RTS, W% Q0 A, {& d3 _# M
P2_BUL:
" T. G6 @! E. K/ D2 ^" j LDA $6005
" N4 ?0 ^5 t( |! L  y0 @ JSR $D7D0    ;P2副武器数据写入+ \7 ~, C. D  v
RTS; v6 t- L" \" {! k
- a" ~3 g3 V8 q7 o2 e" i; V/ r& o
0 j/ X, e* {& _, Q, M0 p) _0 U% a
.ORG $70002 t2 j0 a/ b$ t
  % I  Y. |* m3 ?5 C( Y; B
STY $4014    ;补上覆盖的精灵写入指令
0 {4 a9 L/ P! I# t8 {) ~ PHA
% q% r. A. V+ i! q3 u  T TXA
5 Q5 P# u" j3 C PHA+ y1 C# K4 Q3 c: ~+ \
TYA3 V  Z4 Q" }% a/ \& j
PHA
% F( d" H) l5 I: i LDA $0C0 O5 |2 m( U1 |0 U
CMP #$01    ;比较是否为标题画面
5 v2 H$ x1 R9 r2 M8 X, t BEQ PPU_STAGE
" Q/ P6 p/ i9 K# A" r- S$ G! v PLA% u% E$ s2 G0 ?! |, w( {1 J
TAY
+ W* Q; {: [5 H1 X; R# f) z# E PLA* T9 e& Y4 K; ]
TAX
8 r6 V4 u" q; _$ d; K* y PLA: T5 c6 V" n+ J& u# e
RTS
- A, l8 Z; t# p- w8 n& q3 g0 TPPU_STAGE:    ;STAGE显示程序' {" [+ P9 A; ]8 \
LDA PPU_ADDR_DATA( a2 W+ W5 B: G" ?& R7 V: j
STA $2006
$ Y. d( J% Q) V, |1 p. R+ K LDA PPU_ADDR_DATA+1
* p' z0 x1 S) T STA $2006    ;坐标设置
8 n+ J- u8 c( }( _* u6 B LDX #$00
7 R1 s% o5 j3 H! O' n1 n/ q: G6 r; [PPU_STAGE_WROTE:    ;写入STAGE字模
' _; [  ?( {7 v' @ LDA STAGE_DATA,X0 q! v. q% {) W. ^- r
STA $2007
3 s$ ~. s  }$ ?, H, r INX
/ R7 g* C! y$ t1 K2 f CPX #$06' B* U% }  ~- e
BCC PPU_STAGE_WROTE# J* `: L3 y4 ]2 |
LDA $6010
* G; B: Y8 D5 j! F CMP #$FF    ;关卡数据初始化条件判断
7 B0 T$ a4 y9 B$ o6 l# `- R2 E BNE KEY_B
8 b5 x7 ?# ?/ q- y, L LDA #$004 b! e" \& W  L# M5 k, |
STA $6010    ;关卡数据初始化5 z, K* T4 g0 S, y% F3 M
KEY_B:    ;关卡减少
/ M% J. l+ w/ f LDA $04
. o$ L) _( J+ M* f0 {. j1 \) d: B AND #$42    ;按键B或左减关+ S- h& Z; h" O
BEQ KEY_A
! f0 i  ?* [) s' ?( ~ LDA $6010
7 e' s# x7 N) O& v# ]  w6 I CMP #$00    ;关卡比较
; g& k* d/ d, K0 f; V6 v BEQ KEY_A; @$ m( \$ t2 a
DEC $6010   ;减关9 g% U( ~& f/ l6 A4 H8 s
KEY_A:    ;关卡增加
0 P! |) w1 V. h& f# O5 f, V LDA $04: c1 O5 k' I5 c" }
AND #$81    ;按键A或右加关4 ^5 Z& h0 U: z  e8 ~; P
BEQ PPU_NUM_WRITE
  E" ~3 K* g% F& O LDA $6010) Y7 D1 a/ j5 N! G# ~& k+ h3 p% t
CMP #$04    ;关卡比较
' P5 ]  O. G6 X( ]' A! k BEQ PPU_NUM_WRITE
9 W2 L& F* L. h9 l8 b, _ INC $6010    ;加关  f$ M' a: ^5 r7 r2 e7 L1 H
PPU_NUM_WRITE:
) l8 G: }" @8 h7 k* p$ @  ` LDA $6010/ `9 B# n. t- k8 p* E- Q6 S5 g
TAX  N+ D+ A2 `- M- C. b
LDA STAGE_NUM,X    ;写入数字7 n( {" Z- W3 q' v, K$ r; z
STA $2007
& q2 w5 [7 Q3 e  X2 |! q! WPPU_RTS:
/ ?$ h: Q- M" L PLA
$ |" y# D- Y  H+ Y TAY; Z+ u# H0 `: ~- h
PLA$ ~: J4 [; `& u  H3 J0 L9 ?
TAX
. R5 V8 c6 R$ A3 B) ^' C PLA
0 d& [) r0 A7 K( g6 [1 K0 h7 G1 v RTS
9 \8 K( w' S+ I) t. J% H- [" z' ~
7 z' k' |3 e- R5 W : a, v1 ~4 _7 }) s% _' g+ k2 E! j
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据# p3 @: L" P" f5 ?* |% z
.BYTE $EC,$ED,$DA,$E0,$DE,00) L3 _# o8 P' b, c
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
$ ~' M( T5 N' v .BYTE $D1,$D2,$D3,$D4,$D57 W8 L" H9 m& H8 O+ r% s/ _" q. s
& t; }+ j0 R4 F6 J  t
PPU_ADDR_DATA:
1 o8 r" v: m! S9 c .BYTE $23,$0C: G" B% s% e9 R* y' p8 E" m
  _' }/ B# ~- T

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2024-12-21 04:06 , Processed in 1.059570 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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