EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
& F3 A$ Z' ~/ E4 k2 x
$ t- W% ^' _. G. Z5 v5 Z) d! w0 n得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
  d0 w. T' w4 _然而,今天想到一个思路.
; H% t1 T( P* ^  Y; K* b5 E1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.# H0 W" H' W% M! F
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE- z/ w5 n. n8 d2 X
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
  U& d3 o4 B5 x4 |: [6 i, [) o7 @: o8 p1 }- w7 x* c

3 q, L' W" X5 @# D$ b/ M! h;[FC][最终任务KEY][END]
8 m2 E: w$ v! F# \* p" @& ~button = $04    ;单次按键
+ C- S" b8 t0 j/ x9 kflag = $6000    ;功能开关标志
+ m! S" C1 u0 V8 x# dpause = $000E   ;暂停地址
3 ]( r8 B; P7 [0 Z7 a# ], j0 Z& R
  k- c' l/ }: f2 \7 N+ y .ORG $8000  C3 b% m. v4 ^! i! L
LDY #$08    ;自带的按键程序
9 M7 J( H# G) I% I2 iADDR8002:- u" Y+ Q& @1 A' Q4 y' o
LDA $4016,X4 z$ Z9 R0 c5 \" S. b
LSR/ J9 o- x9 d& F! _. k8 \* V; \
ROL $0021
8 d! S  @$ C% K! f# Y5 Q LSR
" c  h$ Y% f/ x- ~. H' x* H% E2 ] ROL $0029+ @! z" E1 ~+ \% b# u% o2 J0 d
DEY
, S* _) c2 x& a* `; \# u BNE $8002: h1 U. L0 f) [5 S: E9 c
LDA $0021, P' B$ F0 _# N  o- y' Q
ORA $0029
0 K1 [3 c; o# S( `9 S, t( F STA $0021
1 Z+ ~  j4 E7 S LDA $0020
$ s2 M& D" `7 D( f! I% I/ a# q AND $0021% u) {0 {* \( f3 h' f
STA $0020
, j: \* m0 [5 s$ J LDA $06,X
/ O7 [$ y5 E( E8 \# y, G# p EOR $0020
- K- H4 G; a6 e; r% z! y/ S1 j# I AND $00208 N* ?5 ~) x6 F7 C+ B# s2 p; p
STA $04,X
/ c2 L! {# \8 I; W LDA $0020  X( R" M# x" T% x4 V$ {
STA $06,X
, Z2 w' w: Z3 z4 _! y' K JSR KEY_OPERATE
/ \7 t: h6 T' {" I JSR Function    ;功能调用
% u, r9 k1 P+ B8 h JSR Weapon    ;武器切换调用* g5 w4 |2 H. Y( S/ A
JSR Power    ;威力调用
* ?; x( s  L! s7 H$ N: W5 B JSR BULLET_NUM    ;子弹数目! L( B6 Q5 ?( {7 a  h  ]" j
JSR BULLET    ;副武器类型/ F1 w4 o* P$ h) }' C/ \* b7 \
RTS
' v; C1 s& H5 [1 R" P1 k
2 c) X; O% w& Q% P
5 c# A4 a7 m# e+ r* L7 X& \, q$ n) h! e: R
.ORG $8050! o7 z- `, ^) K: I) q: p9 D5 Q
Function:    ;功能
) M7 V, N7 |9 _9 D4 E! y# f+ PWUDI:    ;无敌
! }5 V6 s/ ^9 ?# L* ~3 ~* } LDA $6000,X) `) ~) ]) U1 ]0 Q: r! b( l
AND #$08    ;开关判断
- P8 R  B4 C) |3 K BEQ LIFE
0 Y% u  K2 ?7 R) {" l LDA #$05
& q) C, c9 U0 Q STA $05DC,X    ;无敌锁定
& r1 B9 O9 A# N4 f7 ZLIFE:    ;生命
5 V0 u; U$ v! T7 N6 H LDA $6000,X
2 _3 A7 V8 Z" Y. M AND #$04    ;开关判断$ O- h; _; I# B0 W
BEQ FUNRTS) ?% Y0 D1 e2 A& l
LDA #$05
# w, C* A' }* j( W6 u8 _ STA $1C,X    ;生命赋值/ L. N$ i7 J+ m. b! e* ^6 ?
FUNRTS:
6 g6 k1 b3 H  A RTS$ l( ]2 c/ T, S8 l( P
3 @1 I+ d/ u! q& ], p( _
Weapon:    ;武器切换) R4 o% z5 R% l5 Y7 x8 D
LDA pause    ;暂停状态判断. I& p9 ~/ ~! @5 u, g
BNE WEARTS
5 y- s! T  k7 c* M% N LDA $04,X1 F% ?2 g% F) y# I
CMP #$20    ;选择键判断2 M7 Q" I- g! M# G. t2 Q
BNE WEARTS
; t3 \) G/ W5 o+ W" w. P LDA $12,X
7 N$ l# Z# V( V7 o2 o/ z" i CMP #$03    ;武器值判断
8 h2 }$ `9 j  ]0 B BCC WEAINC
4 I3 t# E4 d+ m( R; B( X' x* C& H: j LDA #$FF
/ _  r4 O9 J# S5 ^* t& N STA $12,X    ;武器重置
' D& h/ ~7 w6 f& |$ UWEAINC:
3 m7 a: L9 M6 ]& X4 j2 B8 `7 m INC $12,X    ;武器增加
6 j9 S8 T4 N$ b/ Z* Y, i
7 n: W( h2 X* ]WEARTS:% b! [; j! r* h3 M4 W( d
RTS
6 ^- w# K0 Q3 y5 z& e
$ r8 H; }' a; p* E% l2 Z( ~Power:    ;威力6 Y! Y( ?0 N6 M# G, Q
LDA pause    ;暂停状态判断
+ c& c# h6 `; E8 ]& m3 G* ~ BEQ SPERTS
1 [5 E( |# O$ t% H7 NBUT_LEFT:
' i' I& o& ?  v9 X/ J( \0 }4 m! z LDA $04,X
* p" u- Z+ }+ C2 i CMP #$02    ;左按键判断! {* U/ k0 i$ K( _
BNE BUT_RIGHT- R0 _4 T* B! g
LDA $88,X4 P# x( y8 W! |5 ~$ b
CMP #$00    ;威力判断# l, v5 V, C" _: m5 E
BEQ SPERTS( q- D1 e, ], O8 @; N# ~9 \6 ~: G# d
SPEDEC7 s2 D& I* A7 e% M1 |; l
LDA $88,X    ;读取武器值; Z( n% d, j, C. c% s% u7 P; k/ D4 Q
SEC
# [9 r) M8 n& B SBC #$08
# A+ K0 _- {+ Z# E5 I  R STA $88,X    ;威力减小/ a+ ^4 I  u: |, M
BUT_RIGHT:
6 M+ k, i) [; ]- C$ Y2 J5 N LDA $04,X: G8 n0 T; p8 T1 B4 X
CMP #$01    ;右按键判断
0 }1 U' u* b0 M7 T BNE SPERTS
. Y( }' O7 `3 u/ p0 Z7 Z LDA $88,X
3 D' K" l7 g: [ CMP #$10    ;威力判断
. G+ l" h( ?) \ BEQ SPERTS
9 J3 ]4 D1 [+ t/ U/ t2 d9 MSPEINC:) n* p) M- {& Z# f2 v5 ^. Z
LDA $88,X    ;读取武器值4 T: z# Z6 O5 j: U) Y. b2 {
CLC" N' |/ y* {( I  F
ADC #$08
' ]6 I' d# d3 H' V5 Y) ` STA $88,X    ;威力增大! D/ y; i7 b, H- e/ X& }
, I/ o9 b6 M# ?# ~& _* |* @, E
SPERTS:
2 Z6 _7 g3 O* M RTS; W9 l& E# q. [1 |$ }
0 d2 `7 e! I8 F
BULLET_NUM:    ;子弹数目* z8 Z  [! q" ?
LDA pause    ;暂停状态判断
2 y2 u$ ~: |! d/ d BEQ BULRTS5 B5 O1 O4 q. M6 `
CPX #$00    ;主机玩家判断
! l! \" Y; d5 M# W BNE BULRTS8 c3 w5 G8 O% x1 v
LDA $04,X    ;主机玩家判断
' ]" x3 H4 y7 R1 Y: D: b0 L AND #$80    ;按键A比较
+ g: u4 C- [6 R BEQ BULRTS$ y: u* i  c& w+ u. E
LDA $87    ;状态判断8 `6 ^* b1 \: q4 Y4 s
BEQ BUL_2& k+ R( k" k7 V+ ?9 x" j- O% w
BUL_1:% p8 y; w1 n  }: R$ _' ^- L
LDA #$00) L6 i# }& u! j+ |' Q1 p2 |) L
STA $87    ;1发子弹/ D, K3 J$ S3 y. H
BEQ BULRTS
: F& V2 ?- B" [9 r1 `8 x) z( JBUL_2:
; [1 n: s! X4 t: d) W5 B" g/ z LDA #$01, c9 D1 j, a7 t" y& e
STA $87    ;2发子弹" j: i0 x- {! S) I9 Y+ l

0 C5 G  S% J4 W' s) V$ N4 m0 K. zBULRTS:
$ w2 R9 b6 E4 ~, w4 W RTS
4 H! B. m  o# \+ L3 T1 v7 q6 r
6 N2 [& Y. Q$ w' ~. I% P& y! M2 k. @# X, T/ d
BULLET:) _7 k# y" ]0 @. r5 y: V7 b
LDA pause    ;判断暂停状态
( ]2 n" j/ M! v. s( O+ V$ G  i BEQ BULLETRTS3 c2 i  F% [2 N1 L
LDA $04,X! i3 p* q1 N( r& n8 O$ z
CMP #$40    ;按键B比较
% C$ p" Y  g0 _ BNE BULLETRTS0 p0 G# C3 e, z' C
LDA $6002,X    ;读取副武器
, j: t& c% e: r, }+ R7 [. u' W6 A CMP #$03
) S" S9 C0 b6 a" c8 K% E( Q BCC BULLETADD
5 R0 i7 ?* m& r* `( c6 N8 h LDA #$FF
( b. L) l# E5 R3 ?7 _/ ?2 Q+ u+ ` STA $6002,X
1 _9 f0 S  u+ z6 D- rBULLETADD:! s+ W5 U$ G( t- b3 o! V
INC $6002,X6 T; g" ~2 b9 [) R/ h
8 H( K( w6 M' f+ j
BULLETRTS:
% r+ ]) {9 d) F; o5 @5 T0 h8 K LDA $6002,X3 f' s# V) x' i3 g1 c# }% q' S# l
TAY. [1 v8 O  F) q
LDA BULLET_DATA,Y. t# \3 J3 f* N4 C) k
STA $6004,X    ;写入副武器数据
0 ^4 Q/ k1 j! `/ {: K RTS
1 N4 A( D. a8 J) O 2 }) F, F1 [1 X, T

1 A2 w4 y2 B2 o* D/ G+ w- _& oBULLET_DATA:! X% a( c7 ^+ j8 L  V" M
.BYTE $06,$02,$03,$04* m% P, L7 ~* U7 {2 h& g# g
$ p1 z; o  l7 T7 H9 y% p

' y% q- _; x( q# {( y2 c8 t , r( h. _9 Z  }8 \
KEY_OPERATE:    ;按键开关操作3 X0 F, Y) e9 B9 k; W9 _" R
data_protect:    ;数据保护. @" Y, O/ y0 N& l" [( {
PHA
/ p/ S$ W1 @9 r2 ^. V TXA' y/ \7 H& N" z9 d# Z/ U. e
PHA! S& o" p9 f0 m# ~
TYA
/ j' y8 x5 G8 i: F. i* G9 L PHA
7 i& G( u2 G( k( h# m
: Q" L% @! R6 n  W( i  JFLAG_INI:    ;开关标志初始化
7 i& I) w+ v! p, Z8 ~+ G5 [  D0 \9 d. Q( W% g
LDA $600F
9 d. r6 Y% B8 L7 }! J; ` CMP #$01( P- `7 y( b! U8 v7 Q8 h% t; ?- t
BEQ pause_cmp
, |! T) L; M  j- U LDA #$00
  E* I; Y7 }* L0 a1 Y; m( y) h/ p STA $6000
! S% @% B, f& f. z STA $6001( V( ?5 v) i" }
STA $6002
& Q) I, H8 ]& q" O STA $6003
4 n. g0 U$ C. i+ O/ b" G: |  V# X STA $6004/ G) ]3 N/ ?* D3 B
STA $6005- O. a  ~" b1 n5 w, J% Q- e4 }1 l& [
LDA #$01
2 B  A, P" ^( G5 K& | STA $600F
* C9 ]& i! x& Y/ i, a# h- ? ; `# R$ Z/ D% D% d% F5 M
pause_cmp:    ;判断暂停状态
& F" l. a# S& ^% M4 h3 e LDA pause, V6 r6 c% G2 m* z6 s
CMP #$01    ;判断暂停状态/ I9 w$ M; i9 I$ W
BEQ button_press5 G- e( v# b0 O
PLA8 _$ F3 r7 }6 I: T* [8 H
TAY( X- ?$ s. W( m5 m
PLA8 w9 C* O& U1 F
TAX
/ b" L/ b/ H2 g PLA1 m. g5 T5 a. d. S0 a) v
RTS7 A' U+ A& K/ F7 R5 a- U$ U5 e
/ C8 j) F; k( ^, {. v
button_press:    ;按压操作7 |  f( V/ D: F4 p& a
ini_Y:. U) x. m( W' j8 I! O+ v
LDY #$002 D0 F( K' L% w! t3 _6 [' Z4 x3 s
button_cmp:, ^2 \% w5 h$ \4 d
LDA button,X: i! |: `) Y& M8 [2 c
CMP ora_data,Y
* ]) N" i6 S, P! Z, }" x2 n BNE count_Y_cmp
6 i" y1 g( |2 A/ i8 ]/ Oflag_cmp:4 n+ Y' U; R8 R
LDA flag,X) E5 A: J/ i, h# \% n0 ]% c
AND ora_data,Y
! N- W/ Q* ?" e8 I6 ?. u BNE flag_and
# H. V( m  v% d7 Z. q* aflag_ora:
4 l: ^6 \+ o5 s1 S% s$ T# b* u LDA flag,X" K9 w8 ?/ |5 [
ORA ora_data,Y
! ~" V9 P# q) U3 a' m/ K2 @ STA flag,X5 E% |( C" Z/ }$ i
BNE count_Y_cmp
& F" @8 I3 @6 u. ?$ sflag_and:/ v0 o" e* v6 a; ~
LDA flag,X
. r' m& Q. h7 B AND and_data,Y. H* s" j- H2 Q* N
STA flag,X& C9 z) ]0 o8 R- u) n; b8 l# I4 C2 @
count_Y_cmp:% T# H) B7 _0 d% P# z
INY
$ O" y: Y9 L, b: w* O: D1 S& u" O* P CPY #$080 z3 F8 G1 e! s
BCC button_cmp: M) ~8 F& A. F# l. Y! @, b: [

* c  m2 {0 c% m& U7 t$ j* Edata_extract:    ;数据恢复* e  B2 \. ~4 n. M: P* `
PLA: v! c$ g1 D8 H9 Z+ c) g0 p9 j4 C
TAY; v7 n. G$ B- W
PLA+ \) Z, J" b# i- _% d! _$ k  q+ F
TAX
5 m: z9 L& J) q" Z) n3 x PLA. P" l' M) g6 ~# Q

. R' D5 V1 w; s# u' G! V5 sreturn:
+ |; n7 H' _5 g2 Q RTS4 b7 l& s+ k/ [

5 ]/ L9 Q: L6 V. A* a# w+ s7 mora_data:   ;按键相或数据
  y) N9 n1 ^1 U" L .BYTE $08,$04,$02,$01,$80,$40,$20,$10
" b9 w$ a# R6 I& @and_data:   ;按键相与数据6 r  k4 e. _$ d$ r# S& K5 x7 N
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
  }  ?8 W/ o% o5 S  d. P. V4 R
8 s; m4 a7 E9 @2 U) i0 A  |: E% B* X
, E) q$ [9 z9 n) A, B8 V
6 F0 P. h. R0 B! a0 i5 v6 L2 G" Y7 p ;FC数据搬移程序 BY FlameCyclone7 r9 t! G) }6 n
.ORG $82008 C( ?: `" S6 \1 y3 G) A1 J, _, v8 `. |
JMP DATA_COPY_PROTECT5 Q' Z& d& h- n& y8 ~* J, F# j

8 O# G- M9 B. X+ {6 aADDR_DATA_TO = $40    ;目的地址! Z* |3 T. |0 w5 E
ADDR_FROM_START = $42    ;源开始地址( ^" L  w: `' O: F$ d
ADDR_FROM_END = $44    ;源结束地址; y1 v+ B( J, [5 O
8 V2 T$ Z4 h7 p9 b  o
ADDR_TO:    ;目的地址
3 d4 t% D$ M* x .BYTE $00,$70
- w2 ^7 U6 H0 v8 u8 n0 Y% D% `ADDR_BEGIN:    ;源开始地址
5 R& l' q, H' g/ |$ L* q; C .BYTE $00,$83
" J5 u" O$ V; Z2 pADDR_END:    ;源结束地址
" i: i- l/ K  S2 @; i1 E, v; Q  i6 z) o .BYTE $FE,$84: L3 Z8 R6 e3 |$ Z, ^3 y: b7 X3 a5 H" f4 W
1 G8 R1 a' F+ R5 k
INT_ADDR = $08    ;中断地址
/ }6 i7 V3 w& ?. lFLAG_OVER = $71FF    ;完成标志
5 B; \+ {& i  Y" w
7 D8 R' A7 R2 w) r# N& \; U/ K; D# D) q
DATA_COPY_PROTECT:    ;保护数据* m  Q5 [9 j, _% R. f" s" R5 C7 q
PHP
+ _1 N" n# ]3 v5 L PHA
  }7 R, U8 D0 ~' F! v  h' m& X0 G5 u TXA1 u4 T3 Z$ c! a/ G' }) q3 d6 T
PHA# q& l0 u1 k2 w& w& [
TYA
6 [; b" N+ o0 d) Y2 q: i# H( L PHA
2 m6 t  _  B& ^% U LDA ADDR_DATA_TO* d; U% f$ a' J9 a
PHA/ }. S8 b" o  V/ q1 R( w7 A
LDA ADDR_DATA_TO+1
( l- A: C8 ]) {1 ?1 o PHA
2 ?$ g& p. `* P6 P+ a LDA ADDR_FROM_START. f0 r5 k* R) ]. {: z7 |
PHA
# {8 V9 c* R7 }  [# n  H6 s LDA ADDR_FROM_START+1
/ Y5 U" D  F4 e# z PHA
1 \/ c- ?: _0 m+ R5 _. E5 c1 U5 E LDA ADDR_FROM_END
, K+ g  f6 j- ?: E) h+ ? PHA
% O9 O9 @! X/ E7 Q. j- P" D& J LDA ADDR_FROM_END+1
/ F- x; |+ }& \# A, S3 M PHA5 S: h# B8 C9 ]7 x  f% L

8 G0 l% m  q8 s% W7 ~% I, ~3 POFF_INT:   ;屏蔽中断! C( \. X; g. s- [
LDA INT_ADDR; V* m3 ^+ c% L# I% r' H+ H  H
AND #$7F
8 r0 m( f6 ?" R9 c- @ STA $2000    ;屏蔽中断
' k0 D! S4 l& A+ Q8 ]" W" o# i# o5 h( D
3 u. U4 m7 |1 Q' w9 M' f
SET_DATA_ADDR_START:    ;设置复制起始地址) [0 l3 V3 r; e! j' e6 J6 O
LDA ADDR_BEGIN
4 o. P: o" L, s STA ADDR_FROM_START    ;设置复制起始地址低位
% M# _$ k& Z. L LDA ADDR_BEGIN+12 \( W  R/ a) V/ U
STA ADDR_FROM_START+1    ;设置复制起始地址高位3 G3 a7 e# d9 K4 s

: f7 Z7 j* s, q" T; MSET_DATA_ADDR_END:    ;设置复制结束地址5 x: f$ n, b2 @* I( c! s' r
LDA ADDR_END3 Z- |0 P9 u4 s5 a
STA ADDR_FROM_END    ;设置复制结束地址低位- B4 T, m% z/ b; j; [
LDA ADDR_END+1
$ t- J& V, }. m' j! r) \/ p! W# ^ STA ADDR_FROM_END+1    ;设置复制结束地址高位
6 y3 Z8 _$ k* l! b
, {0 F; m8 x6 H% F3 j% OSET_DATA_COPY_START:   ;设置目的起始地址
$ v3 {- j/ X7 U LDA ADDR_TO( Y% C; G2 f1 o3 B5 R7 r  f
STA ADDR_DATA_TO   ;设置目的起始地址低位
/ i! K3 a! E( t0 w LDA ADDR_TO+10 S0 X) D* O4 `. s, g) M3 G
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
- y1 N& ^0 }. N$ e. p( Q! q
4 N1 u; a! m1 ~$ W0 V7 H, b6 s" OOVER_COPY_CMP:    ;复制完成比较' M% M/ y7 P* U
LDA FLAG_OVER
( \9 c6 d- r  j, s, } CMP #$FE    ;复制完成标志比较
5 i3 t9 i% V# f/ N BEQ DATA_COPY_EXACT: Q1 T# V2 |* X& V6 g% [5 Z+ {! }
* Z" L" E; F3 x1 u/ X% q0 F0 n
INI_XY_COUNT:   ;计数器初始化; g3 g% B9 {, J8 l; ?
LDX #$004 F5 M( |0 O1 N8 c1 Q
LDY #$000 t2 c& V9 e' L6 G5 ^" d: ^: \- ~
3 k$ {% c! x4 U
COPY_OVER_CMP:    ;地址比较
2 C% n9 p1 m: f8 W& p# r& W LDA ADDR_FROM_START
2 {( }" C  I/ e0 l( S6 v CMP ADDR_FROM_END
* B$ b, r7 c  [$ P0 _& M2 _+ z# m BNE COPY_START' ^0 z4 c" m9 D  v+ g
LDA ADDR_FROM_START+1
! v: x( E0 Q- B CMP ADDR_FROM_END+1+ ~. x& U8 T7 G/ a
BEQ COPY_OVER, G' r+ k: n+ r/ P8 U6 k4 T
* N. E: \3 y' a( \( O/ T5 C7 \# j
COPY_START:    ;数据复制开始1 J4 i' u! W& u/ d% H' y
LDA (ADDR_FROM_START),Y    ;读取源地址
; i! q; z6 Z9 S$ v% g$ K STA (ADDR_DATA_TO),Y    ;写入目的地址
$ n  q/ C7 R. T$ I1 [0 c* c INC ADDR_FROM_START   ;源地址低位递增
9 ~$ M+ `1 m5 I7 q5 U8 o0 y/ N INC ADDR_DATA_TO   ;目的地址低位递增
1 P1 y+ R( e: t2 [& n& R- s BNE COPY_JMP
0 F5 n! _0 I: y# {$ ] INC ADDR_FROM_START+1   ;源地址高位递增
4 U$ j! ?( Q6 \ INC ADDR_DATA_TO+1   ;目的地址高位递增2 r! _& d: F& X+ }- a+ q% Z* P9 X

. p: o  D1 m: M3 L6 NCOPY_JMP:    7 Q, O% g, l" p
JMP COPY_OVER_CMP
7 n7 m' G# U4 p# z# r( V8 \; _5 L) `* g% W8 ]% J
COPY_OVER:    ;复制完成
' Y9 {% j, |2 n. y LDA #$FE
" n+ {' [) y3 v' Y' y" ^ STA FLAG_OVER    ;写入完成标志3 z8 H3 P2 U7 E- g. \, l& H
FINAL_BYTE:
9 d% r" [9 E. I7 r2 f LDA (ADDR_FROM_START),Y    ;读取最后一个字节( e  _$ u; v: e# J" K
STA (ADDR_DATA_TO),Y    ;写入最后一个字节) i- \) ~/ S9 S! n- u- H
+ R: h/ X2 S0 u! E# @
DATA_COPY_EXACT:    ;恢复数据! A3 d- A- i' D& Y0 k- H
LDA INT_ADDR) O# u! j6 p3 q. a2 I$ D
STA $2000    ;恢复中断
2 {7 _! d$ g! M PLA+ h" K0 B6 q& r
STA ADDR_FROM_END+17 ^' R! v: n% d" R  }
PLA  P& w* {$ s6 G1 s8 d( J6 L
STA ADDR_FROM_END* u: I; w' Y# f" G& T7 D& f1 T. I
PLA. j9 Z8 ?1 L: P8 N. v
STA ADDR_FROM_START+1
4 P1 {1 u' R: \% @9 m PLA4 S" D" C6 o, t9 U! O
STA ADDR_FROM_START. i4 A* g/ ^$ t# Y' x& W
PLA0 q& g: e' p/ q1 c
STA ADDR_DATA_TO+10 K; S% `( R8 I0 J
PLA
" f. O8 n8 w  t7 ]1 ]5 M STA ADDR_DATA_TO
9 J1 p  i/ w1 L6 A- n PLA+ c' [' M. ?; G# e$ k7 s  P
TAY9 K2 x7 x/ `/ u1 F4 p" p  B
PLA
2 U1 }0 N- j+ Q+ |( [; D& o3 ]1 o, X3 i TAX
9 u" N0 p' |7 {& B PLA# G' x. j. @5 b  d7 P7 E+ q
PLP, V- v) ^8 b9 |
$ A7 p2 d$ b8 Y& N! I: b
% A# f" E- H' V) c6 r
1 a1 ~$ W* B! o/ C+ ?
DATA_COPY_RETURN:
- f( J/ _5 x6 g, ~! y RTS
7 |, }, R4 X( u) G' w5 J
7 ^3 h: ~" t3 S8 X8 l# n' Z .ORG $C056    ;精灵指令覆盖
. N' k0 w) `, B8 c8 T JSR $FFB56 H# u$ f7 K9 F% O- f% g. g/ f

' ~# ~. F1 ^/ @; v2 } .ORG $FFB5    ;
/ B: u% _, p/ t% t4 q* c PHA
; [3 T4 Z* I/ h5 N6 R) ]  TXA
6 ~1 r2 O% ?0 p. a7 W# x" e PHA
" k. b- ^2 z+ N6 x5 ?( U& r( r. q TYA7 F: j- W+ x  I  u6 G6 Q, N& J& T4 b8 b
PHA  U$ u, A6 e  N& e
LDA $71FF    ;比较7000-71FE数据是否完成复制
% O" x7 }* }! U1 B4 l3 `) _ CMP #$FE& u3 h5 d; X) G$ a# H5 l) q3 Y
BNE ADDR_FFCA; g% b$ P) f# D+ c8 h1 H
PLA
: {# P/ d- K5 p! l TAY
8 t! E+ q, f1 ~( A* M& a PLA
8 I8 z2 Z+ D% Z TAX
$ X' s* V" }' P- t3 n PLA
( f# @- f" r: f* ]" L# k JSR $7000   ;跳转到自写程序
- d6 G' w6 X, y7 i" t, {' P( Q RTS2 e, k+ G' c) M2 G; Z
ADDR_FFCA:
+ q& V, a. ^) I3 R PLA0 K- D  D0 |/ g
TAY" ]" M" {% B; j- `* x
PLA
9 [' v1 C9 p5 n: V1 c TAX8 E% ~$ f9 a* r4 L. j+ I$ K2 E
PLA
8 l& i# h' X' H- T  X" F RTS) j7 k4 ]( E, W4 O3 v

- B7 |$ M& j( \+ N6 C! D
$ b0 t4 Z1 U% G, o* [$ X2 U7 ]% p, K8 D
.ORG $C264    ;自定义的MAPPER2切页程序/ e( }7 G9 m5 X6 T
PHA
& L, G& `& u0 Q9 e TXA0 K) [  `* v! j" M2 [. W
PHA
2 z1 b6 D0 O' R4 j+ J LDA $0066
' K! y' @3 K$ D( n- w BNE ADDRC280
9 P+ x# I* L- \  ?0 W LDA #$07
' C; m# @* D7 j4 `3 a LDX #$03
! x3 O0 N8 X# ]1 Q. }1 Q JSR $CD9B    ;自带的切bank方法6 @6 K. R- p3 E( r/ B& i1 Y
PLA
* a( R0 w; A1 u TAX1 y; s' k* [" q/ U
PLA
- `9 r$ z3 L; G) \* @0 c# c0 @ JSR $8000& |; ~( C% G3 R% W# w4 x& ^- h- S2 Z! P
LDA #$06# M$ j4 ?9 \1 t. W1 t/ e5 l
LDX #$038 I6 j  I( r+ ?7 }( m7 R) R# u9 u
JSR $CD9B    ;切回原该切得bank(可以不用)
- ]5 [3 m4 W! `* h( y+ U8 y RTS( c! h( ^2 @# q3 V) X
ADDRC280:
5 k9 [4 |5 x2 A3 u, S8 v( Q8 s PLA5 f, p/ l( g! |4 }7 {
TAX! Y2 d  t) ?4 y
PLA
( D. z8 K( U1 D9 G) x6 z+ p% g RTS
! l: J+ F, `1 k. o& ]
) l6 n; D. Q& o& L9 k2 v1 N ; Y1 ]% i, @$ t3 g5 f1 }& z! T
;[FC][最终任务PPU][END]
+ L1 Q0 X7 o' t& P, v6 g .ORG $C056    ;跳转到PPU重写程序' Z6 W/ G6 G: {- x2 ~2 }1 o
JSR $7000& {) t! k: K% L( b' |

) X: o' H- F& w1 }) l; z .ORG $CEBF
4 P3 Q  `4 s/ q7 W; P, t JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入: c4 x9 n" _# M& B  D- Q5 Q
  * f' P3 \5 F. P* m+ q* ~$ ]3 [+ m
  .ORG $E4609 w6 q* m! \6 I! S. Q
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
' Q' N5 P1 C6 P& O) k& r2 u  
4 I4 R% O9 x) t  v6 I( i' u0 i .ORG $71F0* V& ?  {2 f) l9 N
STAGE_DATA_WRITE:
5 h/ y" ?8 }4 |2 r  LDA $6010! H: q* x; E7 \/ k$ Y
  STA $1E    ;关卡写入" s  [  ^6 O% n# G1 G# g
  LDA #$00% f* q6 C- P# f7 M8 b
  RTS
+ m" `; }4 s0 U' W6 ^* w .ORG $71C01 N" U, p7 K) u1 @1 O
BULLET_DATA_WRITE:    ;副武器数据写入
0 B$ R3 ?9 ^' c0 x CPX #$0E
( t2 t- x% E: t, R* ?- u BCS P2_BUL
& C9 o3 Q; \% `5 TP1_BUL:7 F7 M4 }* Z5 W6 J
LDA $6004
' p1 K! T7 G/ Q JSR $D7D0    ;P1副武器数据写入" y0 C- P" [+ e& U" ^& s1 i
RTS
" X( \. u6 q1 F0 B* _P2_BUL:( o. y% m/ L- @( s" L% }
LDA $6005
: }1 ?' A, V8 B3 }& y9 m JSR $D7D0    ;P2副武器数据写入
0 O$ J! Y' }8 s+ W; i' ]8 p! v RTS+ n  S/ K, O& m  [/ ^; e" r5 e- q

1 l( l* G( w. u! _3 T5 i( v% l  `, ^9 ~' e2 u3 T- a
.ORG $7000
/ G0 @( }, ?/ l2 ?+ i3 A7 V# R* |  
( H5 k8 {& x6 W0 |& P STY $4014    ;补上覆盖的精灵写入指令: E+ B6 f: t) ~  G) k
PHA, k% c5 `# f+ _' h# V3 z! h  e
TXA$ j$ i4 T) Z- t! c1 x
PHA' W8 y$ G1 }7 g! h7 s
TYA1 q+ [# a5 d' [  l
PHA4 x3 D: B( ~4 D
LDA $0C
9 j( e& `0 J( ] CMP #$01    ;比较是否为标题画面; J3 n8 W3 z: ]) X
BEQ PPU_STAGE
! c/ c/ f$ h7 |- `2 d8 }, I PLA7 ^7 D5 N& R& m  G
TAY
$ {4 K+ w, N9 O) U$ p6 B7 N- L PLA
) c; [7 a7 i5 X7 u TAX
" C# V$ U* O5 J1 R4 Z9 w) _' _# V PLA5 Y% s- \( e1 v; j$ |8 H+ q+ m
RTS# Y8 q% F- U' C0 c! [6 r
PPU_STAGE:    ;STAGE显示程序
, B. f; D+ n/ W5 L LDA PPU_ADDR_DATA
' f& W- e4 V  p! b9 k8 t STA $2006
6 O6 H3 I8 Y: c" ? LDA PPU_ADDR_DATA+11 [2 X- _9 m9 F  k, }
STA $2006    ;坐标设置; {; E8 c8 b; [- R, d  L9 I
LDX #$00  j4 g/ s0 c8 V) C
PPU_STAGE_WROTE:    ;写入STAGE字模) F, E) `3 f" E! a* |7 n" N) q1 J
LDA STAGE_DATA,X2 C! E& ?6 b$ ]/ e9 H
STA $2007
; H8 Q6 V% F* r% a4 l# D# b) F2 N INX
2 G- _$ s/ ?1 Q8 H9 M CPX #$06
; z2 w3 k2 N  L8 H! B BCC PPU_STAGE_WROTE$ |* N- g5 x3 @
LDA $6010! X; ?, c1 ?! O3 ^
CMP #$FF    ;关卡数据初始化条件判断8 t+ y; w; G7 d9 |5 z- v
BNE KEY_B# G; F4 U  R( t* }' Y& P6 d- e
LDA #$00/ O0 E7 @8 O" U* D: Y( ]# ^
STA $6010    ;关卡数据初始化
5 R& f3 I  B+ a" y7 x, Q& IKEY_B:    ;关卡减少
5 |2 o) `6 n! ^/ N LDA $04& Z3 }$ T& M! q
AND #$42    ;按键B或左减关) r# S' `/ D( J3 B* g% w
BEQ KEY_A$ Y" H& Y5 _# R  |' C
LDA $6010% T% Y. `3 L  {1 Q0 n
CMP #$00    ;关卡比较) s% ?. w4 r0 O$ A
BEQ KEY_A" O% B+ b: [, U( Y: D
DEC $6010   ;减关7 O  w8 Z7 S- e
KEY_A:    ;关卡增加
7 m) @! N9 i. {8 [/ x; x: q LDA $04: [! O* L6 V, X' e, j( W' u
AND #$81    ;按键A或右加关5 `8 r1 }9 L( Z+ r1 {- b# ^2 p
BEQ PPU_NUM_WRITE
5 N6 @( u4 @5 ~2 W LDA $6010
( J; E/ i& _3 C+ \" z4 j CMP #$04    ;关卡比较
7 G& X; K/ p% O1 Q BEQ PPU_NUM_WRITE' t* N+ B9 T' N& x. Q9 |3 K  L
INC $6010    ;加关8 P% ^9 K& [3 H( D: d, g7 z
PPU_NUM_WRITE:
* c8 J3 U9 l( r/ a9 J3 U. l LDA $60101 K* k. [/ A1 p2 V1 N
TAX
1 {7 w! \4 e; m: h LDA STAGE_NUM,X    ;写入数字
9 z8 A2 O7 o. w; f! e STA $2007! P* R7 b! D; K' N9 B" W5 {* z
PPU_RTS:
, s# j" K; R& [ PLA- o$ B& ~2 C! J, A* d6 |2 @2 p7 f( \
TAY. W. x' R2 G4 C: r9 C# J% u
PLA% t9 x% a- Q+ a  s3 o% i
TAX: W% B/ S2 W! l9 _, S( l
PLA+ C8 K3 b; g: t2 d) d- j
RTS
) N6 p( ^; X8 X' B6 L
$ a6 ^' P0 B' g# j1 Q2 q! B
; z9 V9 w1 Q8 i3 _STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据
+ c6 W8 {/ c, ]% a5 ~8 c .BYTE $EC,$ED,$DA,$E0,$DE,00) e) R9 v& n6 D$ L
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据  U! S* F  y: K6 v; ~, o
.BYTE $D1,$D2,$D3,$D4,$D54 x2 K+ o- v' ^" D) A

7 z5 A+ g: y2 H' wPPU_ADDR_DATA:' S: w% c9 N8 b# L" s
.BYTE $23,$0C; T" U: R% A% M0 j! R+ y
9 a0 d& ~% j9 ^2 d3 ?9 I

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2025-4-23 05:09 , Processed in 1.152343 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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