EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
. n, c0 m+ q% _0 N1 _8 o7 V+ c1 i) N. d6 }  H6 w% M7 ?3 d8 M
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.4 V' A5 W" l  Q4 ]& }1 U' u5 Q
然而,今天想到一个思路.# M% u. ~3 g; X: O0 m1 @, n9 t
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
; A4 t% F' j, C, t* V7 w( J2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE9 M3 k9 L% U( y
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).& Y. B4 s! K  h9 ~  n" ^

9 V/ Z0 U  e4 i. n0 n9 v" |
- i  }! ~- h; x;[FC][最终任务KEY][END]
; @; |5 b. e) `: c- hbutton = $04    ;单次按键% x5 G) G2 Q- W
flag = $6000    ;功能开关标志
" x8 d5 F* m: a( j) _: w8 xpause = $000E   ;暂停地址( W9 J) ?% a7 v6 T' e, V

( T9 R" a1 Z4 ~9 o5 Y .ORG $8000
. T4 G. z8 w4 O' ] LDY #$08    ;自带的按键程序: T9 l1 H& n3 H! X* {
ADDR8002:
  C7 j% u6 _* O- c3 x; g, u LDA $4016,X
$ w. A. q# s3 k, h: M$ e+ a LSR
# F- d2 J& h) H! v ROL $0021
+ `6 r. Q7 ?. c2 G7 D. I# S LSR
, \4 L5 G1 `2 I6 z ROL $0029
6 k+ l4 `) `: i- k8 Q) ~1 Z DEY
/ b6 R' ^: h4 N$ k( C4 Z BNE $8002
7 e+ Y$ w: r8 M9 @# R LDA $0021: }8 A4 W2 f& L. M4 d
ORA $0029: |+ r1 `& |  E5 G- p& Z
STA $00212 j. a- M; u* i9 r  A
LDA $0020  O! @: q& }% c: m6 L( r  V
AND $0021
2 V5 H2 i4 `8 M( r  k  G( j/ F STA $0020
# ^1 `: J* V2 H% p5 G2 c LDA $06,X
# r6 ?. G+ ?& E5 O8 l EOR $0020! b  ?0 K- x- Q1 @8 @8 ^5 x  d* W
AND $0020
& J1 _4 G$ C: M STA $04,X
8 P8 ?+ P6 T5 n* K. c! z9 J  k LDA $0020
4 r' w( l. U: ~ STA $06,X% i& S. Z8 {: m; [  b0 r
JSR KEY_OPERATE
: C: i$ ?; U( S& ]2 m JSR Function    ;功能调用
. s2 l; [& Z; Q JSR Weapon    ;武器切换调用1 t7 A: _+ U" Z$ \3 h
JSR Power    ;威力调用
& o- H' [2 Z& {! {. u JSR BULLET_NUM    ;子弹数目
! _& q  _& }. P$ P JSR BULLET    ;副武器类型
! q' |1 Q  A! Y5 i3 o$ u RTS0 h! W: {( u% L$ \7 J

- y$ v8 j4 _8 z2 i3 p; o, A( M   h  N7 L) r6 k  ?2 K- y# s* [; w  P) l
' r6 ^3 h3 |4 n: d. b4 h" ~% n5 I# ?
.ORG $8050
- v1 C+ [- B9 KFunction:    ;功能# b  }  m7 B$ r3 b7 J+ T
WUDI:    ;无敌( k- G( ~/ @1 C) g
LDA $6000,X
2 J8 g6 Q2 i7 z3 ^% p7 ^ AND #$08    ;开关判断
6 l% A0 `  P) _3 c* m BEQ LIFE
+ a8 {: q3 D1 J) i+ ]! _ LDA #$05
: y# y; c/ I4 [ STA $05DC,X    ;无敌锁定, G, V$ f- s( v% z1 A+ i0 x
LIFE:    ;生命, i9 }0 r0 X0 K$ B! l& x. t( d
LDA $6000,X
* ^! y& ^/ C0 X5 F# m" _ AND #$04    ;开关判断% L, V: q- P  R
BEQ FUNRTS
1 |7 L4 \  }* z8 E5 P+ o LDA #$05
" V4 C6 E' Z) M& g* T0 U STA $1C,X    ;生命赋值2 Z9 J% `: \; V% O# h
FUNRTS:( W5 }  ~0 Q  W% n- \
RTS) N( r8 f; p6 d

2 S. @$ ^4 w8 E5 V0 [/ EWeapon:    ;武器切换5 G4 g- D& T: y9 q* {
LDA pause    ;暂停状态判断% A& Z) t2 h9 E6 o& ?% ?
BNE WEARTS' y/ ^0 D+ u4 ]: R
LDA $04,X
% H) o) u& ]' A* M) H6 @% i CMP #$20    ;选择键判断
) F* P; W; i! | BNE WEARTS
" X  ]: t. D$ O1 L6 }# |4 i% o. u LDA $12,X7 e  Q1 E  I' R
CMP #$03    ;武器值判断
' Y; T. a& N2 ~2 a" _  V2 \ BCC WEAINC
( E$ e; F8 o9 a* b% b, Z2 e LDA #$FF: Z- S2 G0 f5 A  b! f9 \
STA $12,X    ;武器重置1 E; d4 p; C' R4 K! W' p
WEAINC:8 K8 q, ^5 Q6 j0 O, s5 ^
INC $12,X    ;武器增加
1 i/ ~0 F( D9 |) Y 3 j9 G' A. |  H# M) v1 e) h
WEARTS:2 N. T& b$ g# u7 M  r" R7 C
RTS0 |, e$ S1 s) f' D  g! c3 H

: l% M6 L* l% x; ~' K1 ?Power:    ;威力" U& ^7 ]1 i. G. r6 Y* r4 N
LDA pause    ;暂停状态判断1 f- g  d* L  v, m% I
BEQ SPERTS2 r9 U& J, U) o0 i3 u; ^
BUT_LEFT:
* G7 H" s& r  w: X2 i LDA $04,X  i# U" Z& s( P" ~% b. b1 f3 V2 ^& Z
CMP #$02    ;左按键判断  H6 Y) D% D) q3 Z: {2 z6 T
BNE BUT_RIGHT
. q8 x/ ?& \1 T8 j LDA $88,X  o( j  @, C, G3 }* j0 d2 |
CMP #$00    ;威力判断
! J$ p0 e: Q4 a0 C: h, |4 [$ j2 X BEQ SPERTS0 }" A4 M: E/ A$ e' O( P; h
SPEDEC
* U: p; T1 A6 u: H LDA $88,X    ;读取武器值
  [7 t' i- w/ N) O+ I3 { SEC
  w2 G5 [1 E! q5 p5 D. t1 X, n SBC #$08
0 Q2 p1 l) G9 X7 b. j& O STA $88,X    ;威力减小
2 @* @, k. P6 D6 ?# u% _* ABUT_RIGHT:
. s  y! B+ V% f1 V) A LDA $04,X, ?7 j- _6 N+ S% D$ L9 q0 \
CMP #$01    ;右按键判断- l# a& R/ q9 S5 @7 a/ T( B
BNE SPERTS
0 Z9 z: v! [- Q% I LDA $88,X
$ K/ p! M. v7 L9 J CMP #$10    ;威力判断
4 O- t& M# x7 C BEQ SPERTS
/ r3 P9 W2 ?7 @' oSPEINC:  ~' B4 F$ m( B
LDA $88,X    ;读取武器值
+ p( s8 h0 N  n% p: z CLC
! z& O& ]9 c6 D. w ADC #$08# C1 U9 Q' E. h  D! G% t
STA $88,X    ;威力增大1 q6 D' a  O" F/ s$ P+ J
0 T5 i3 ?) r, m0 W& \% M- r) R" P
SPERTS:
- b  p4 V6 T, ]1 Q( o7 { RTS/ u( {. n: F/ v; C2 W: |& r8 l8 h

# t( g3 g' ~8 E& o: g  D. fBULLET_NUM:    ;子弹数目/ V) s( Y( D! _
LDA pause    ;暂停状态判断
7 h4 K$ [8 ?2 ?# p BEQ BULRTS
% B% R' o: N4 ]0 U CPX #$00    ;主机玩家判断$ r. `: @$ D4 C; K, n
BNE BULRTS
5 e+ s" `1 Q4 n% b4 |. _& l LDA $04,X    ;主机玩家判断
0 i4 l5 V; c5 S, s; { AND #$80    ;按键A比较
* E2 h8 ?  p0 v) R6 _1 \" X8 S BEQ BULRTS
6 Q" _( q! A/ z/ b LDA $87    ;状态判断
, T+ P' F2 B! \: _# G BEQ BUL_2
6 n; e( _+ |  Q8 F8 L0 M" s# eBUL_1:
+ ^* ^) w3 |' ~& H( g9 t/ ~8 ?" E LDA #$00
0 R. D: }+ \/ W STA $87    ;1发子弹  w# Y' Z3 D& n: k
BEQ BULRTS7 q' I5 f% x$ e& p; k/ |
BUL_2:0 Q) L* u- m7 v( a% e" W2 E$ f# `& J
LDA #$01
7 J# ~. u1 D8 n  C5 x/ T STA $87    ;2发子弹
  r/ M; X' `" U5 k & Y, H# r  T$ s# u" U) X& f
BULRTS:
# [9 J4 ~3 b" l# x  ] RTS
. W4 V) i" Y. g % v: X6 k; i$ i4 h

; [8 \' T! p5 IBULLET:
+ z, N& S" r. B5 t LDA pause    ;判断暂停状态
& a3 J- v! p. ? BEQ BULLETRTS
2 s/ C6 z  _# e* d5 p LDA $04,X* t; G+ t' q/ Q+ z; B4 S9 H& ?
CMP #$40    ;按键B比较
- w: m" b0 T3 |, D* O BNE BULLETRTS7 U5 {9 p, B& ?6 M* S* D" Y1 X; W
LDA $6002,X    ;读取副武器2 y1 \, R& c5 z
CMP #$03
/ W# Y# r$ r! T" ~( Y. i- R4 \, k BCC BULLETADD
* ^) X& o- `" a4 p  t LDA #$FF4 ~! A4 `9 S0 c5 @! W' p. s, B
STA $6002,X
% C6 k5 o: X/ |* Z+ C/ f2 t9 u' _' LBULLETADD:5 y4 {- `- P3 a
INC $6002,X
7 f% U* I, u- B- [9 } ) q; C, W: ^1 ]! p6 b7 X& O
BULLETRTS:
6 j% U/ e' h5 n( Y5 `  e2 R LDA $6002,X
/ J0 }& P. v7 s  |- E! O TAY' R4 \9 Y& C( H2 C( W2 q# Q/ C0 L
LDA BULLET_DATA,Y! j# {  B' @0 T( w
STA $6004,X    ;写入副武器数据. L  \6 R& q) b4 k
RTS& o" @+ s# i8 W( E# ~

6 [' H3 K0 [5 I! {+ M* ]" ^ 7 P4 k: ~3 Y3 q7 M, R: B% ?4 _
BULLET_DATA:
4 _3 h5 S1 v, A8 Q .BYTE $06,$02,$03,$04
4 i1 E# X* B7 Y0 Q( L4 d * t% U& G) C7 P0 h- N; G
8 e+ Y& |2 |8 a  k' T: e) f8 e

9 j  f* @$ S0 [( h7 p! r& FKEY_OPERATE:    ;按键开关操作9 o. s, N; }: W4 m  t
data_protect:    ;数据保护
9 s1 q1 P% l0 [2 M: x: F" Q9 e PHA
# C5 N' U: i0 _9 y  v' {) Y TXA
7 Y3 @3 q! J& J- X! L PHA% A% _6 n+ d9 b; l5 ^& }
TYA, a7 J# {5 d$ q% \
PHA
/ L/ x0 X6 ?/ j+ b: u, d& u' A+ o3 u: w2 c
FLAG_INI:    ;开关标志初始化
0 Q9 A. m- H* @+ T
- \' G+ v8 V3 L' x. i0 b4 p LDA $600F9 o- U: P# F* j3 q
CMP #$01: }, ~8 `& ]1 V4 h! d
BEQ pause_cmp
; M( \$ o- z" _$ Z& j- ~ LDA #$000 p9 _2 u0 j# \! @" C9 z! @
STA $6000) H: C/ l9 K! W, M0 n& B/ C; Q$ R
STA $6001
# h5 ?  v' p4 x+ P# X STA $6002
4 F8 @; e* @1 k2 R4 Y# x STA $6003: \1 R0 P/ i) I2 h: @$ p
STA $60040 G* A+ [$ c9 e' c
STA $6005) O8 D3 \! P* m  M" U
LDA #$01
/ Q2 z* o. W; A$ a STA $600F
4 l6 J5 @; P2 a: m/ K ) b, G/ C3 L' x: t% R" ?  B
pause_cmp:    ;判断暂停状态
3 z/ `3 c$ e5 t) M: @ LDA pause8 k+ t0 @8 K; e. x. c* ~
CMP #$01    ;判断暂停状态
# a9 i8 y$ X; |. o, e1 V8 k+ ~ BEQ button_press
; A' e, {4 h7 R/ C  T PLA! u! C8 d2 S( t9 g0 V# S
TAY
3 P" @$ y8 {* x! y# q3 ^ PLA
- T0 b. }7 j" p) J8 l TAX
. L: t2 U% g- `+ x8 _ PLA" v+ ^5 q- q7 l/ c8 w
RTS9 b+ _; C( ~% k9 [7 o% z1 V* X

2 d4 L9 M' X' \; n& s0 z1 Abutton_press:    ;按压操作
! Z4 T4 G# _& o2 ^* O4 A$ v0 Zini_Y:
7 }: h% o1 s4 O# [1 N LDY #$00
% D9 V1 c+ q  l- \  c0 A# T( G8 V/ rbutton_cmp:
0 X0 W: m: c$ D8 o4 n LDA button,X
% u: m  O- }* Q CMP ora_data,Y) M: m5 n2 K% t1 ?5 ?4 v
BNE count_Y_cmp
5 @$ s7 H# a& J# u$ A) V3 i' N; Dflag_cmp:9 b8 \, z2 b4 W" `: \9 O1 \
LDA flag,X  k, b+ s# T7 G
AND ora_data,Y( M) V; H! |" d0 A1 i# H$ `" j  ]. H
BNE flag_and
7 r0 v  _2 d& c6 n, z4 D  ~* {flag_ora:
5 E; v0 [8 `8 z8 y! O LDA flag,X1 Q. l% {: p* I# P* W; x
ORA ora_data,Y# B; Y' k) O2 Q4 ?
STA flag,X
' U, p/ {' P. D) Q* ` BNE count_Y_cmp
, ]7 Y5 D: Q/ J7 y: E% iflag_and:
/ V4 H, E- X. @( r LDA flag,X
: Z) }+ r9 ?7 `$ D6 S2 B' N AND and_data,Y
3 _+ G  f- C$ O1 b. S3 d* A STA flag,X! I" T2 Q! T( n
count_Y_cmp:
0 G$ B$ x6 i2 w1 z+ h0 x INY0 @1 X* p4 O3 x7 y
CPY #$08
1 q4 u0 u: Z) x; T' z BCC button_cmp
1 G0 u! a3 @- I- d4 n# `  I0 q8 Q
5 {+ B- d4 y' o5 J& \/ v7 Xdata_extract:    ;数据恢复
  a7 J7 j/ \. A9 B+ x) w  h PLA" Q9 C8 R) z4 E* r+ E9 n
TAY
! w0 g  W8 F7 ]9 `& Y PLA. O) M9 `5 Q) H+ u
TAX* p- q! R4 ?6 @6 x* A
PLA5 J' Q- [8 A" O0 j5 F+ q1 T6 ]
/ _# I/ c* P, m" ^% @
return:/ @6 e" x4 U# `* _) O. k! B
RTS; q+ a+ `" M9 v9 I& y
+ s) k4 G" Q9 j1 ?
ora_data:   ;按键相或数据$ v( j; e% j# ~
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
4 r. E# m* F; B  A" ?. r0 }and_data:   ;按键相与数据
6 r7 U3 |7 a# T, S5 l6 q$ { .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
1 k5 @# }( u4 ~. ~+ g0 ? ; l8 T0 L  C7 J; P6 s

! h2 Z: D$ j2 E 3 L) B$ B3 T* `* Q6 i: ]
;FC数据搬移程序 BY FlameCyclone
9 _, F& j  n4 O7 v; ~) k" _' v  ]$ x .ORG $8200) X. z/ ^7 _$ w7 X; S
JMP DATA_COPY_PROTECT
0 r+ Y) B0 v$ i3 |. Y) P  h/ X8 w, u5 z8 H! {
ADDR_DATA_TO = $40    ;目的地址
4 E/ S2 y! Y. h  ?% c& VADDR_FROM_START = $42    ;源开始地址9 w& ]0 z2 w8 @8 B) D( @9 |+ U
ADDR_FROM_END = $44    ;源结束地址
1 F- j: o2 ?8 n: ~
- D5 @% G3 V4 X: N8 j  t9 ]ADDR_TO:    ;目的地址
' [3 [4 Y6 I  [; N4 L' H6 y .BYTE $00,$708 J/ Y. w) o& W( }5 F
ADDR_BEGIN:    ;源开始地址( Y! x5 j$ c; X) Y* _
.BYTE $00,$83
" k7 n$ E% j$ g( ^" z$ FADDR_END:    ;源结束地址* v1 T# I3 p3 K  K
.BYTE $FE,$84
6 A/ L6 k7 w1 j. o: \, L! r3 }- r$ d' X, Z- v# a/ J
INT_ADDR = $08    ;中断地址
, G: V) |% y; T: F; OFLAG_OVER = $71FF    ;完成标志
) J% {$ O" F6 q7 w7 z0 M' m& Z; e1 l
. e3 x% ]/ @0 b0 p
DATA_COPY_PROTECT:    ;保护数据, Z- y! N& h  T! |8 t, D
PHP
% ~- \8 e6 @+ \8 j# J" Z6 J PHA
7 {7 U% F/ I9 W( H TXA4 F1 O4 C3 ]1 A/ T% c% ~
PHA9 e1 x5 z/ y5 Y, `& ]
TYA
0 b. v! ~# l+ A9 Q' X2 S/ O+ `' U PHA
; h* t) |+ |/ S, a" s' d LDA ADDR_DATA_TO# m9 z3 Y; r1 V; c% G/ c
PHA3 Q5 O% q5 u  p1 [
LDA ADDR_DATA_TO+16 i7 j* B' y; h
PHA9 S, l7 P, d* q% r9 t3 d2 f: Y
LDA ADDR_FROM_START
$ ]; g8 h, C/ N1 V PHA; E- h, {! @; W
LDA ADDR_FROM_START+1- F1 P& f- i4 T1 l: ]3 v. a
PHA- }2 S6 l! ]% k, x* m
LDA ADDR_FROM_END
, \1 \( `7 [7 e+ ] PHA
( u3 M8 s/ V' q. L  F, x* y" p( P LDA ADDR_FROM_END+10 e+ n: [5 \, x2 w( C0 V4 p
PHA  ^8 o. a7 ~7 J% d+ w
  w  L# k! j% S/ B1 G- h' t
OFF_INT:   ;屏蔽中断# n% u2 [! }% p. Q* e" [: \/ m
LDA INT_ADDR) z  F: L8 p5 o$ {6 y4 c
AND #$7F. q. K# J* s: Y$ c8 v% S
STA $2000    ;屏蔽中断1 F; _  D  w& E

- M8 Z( X& Q4 [1 i8 {/ A
: {0 T9 |- |! |8 K/ [SET_DATA_ADDR_START:    ;设置复制起始地址
5 ~- k8 i, k- {6 ~8 T. C LDA ADDR_BEGIN0 {# D' c1 x' b& \- G
STA ADDR_FROM_START    ;设置复制起始地址低位
) g! p: d' @3 \- N4 j& l LDA ADDR_BEGIN+1
2 V  n9 V$ F$ K# c. W STA ADDR_FROM_START+1    ;设置复制起始地址高位( Z/ G" ?! A1 V1 S

( w+ |( _3 K3 `4 bSET_DATA_ADDR_END:    ;设置复制结束地址
1 \: \0 }5 x. q, A! F LDA ADDR_END
0 k2 G. U; ]8 L# F STA ADDR_FROM_END    ;设置复制结束地址低位9 k! P) U* H7 U1 d, k$ ?
LDA ADDR_END+1  P8 X) y3 y3 B* b' A- \, y7 v' J
STA ADDR_FROM_END+1    ;设置复制结束地址高位
* \6 e! \% g* Y4 A; A # U" ^- e8 j5 E% C3 C
SET_DATA_COPY_START:   ;设置目的起始地址4 y. I4 z) O/ M/ o$ ]) q  O' \
LDA ADDR_TO
- |; A- l% W- a3 E! t# [2 u4 _ STA ADDR_DATA_TO   ;设置目的起始地址低位& U5 X9 U: i- T+ g5 K9 X
LDA ADDR_TO+1
' o4 S% N* O" U) Q1 S4 q STA ADDR_DATA_TO+1   ;设置目的起始地址高位
, l: N) S( D2 n: p " }; S6 T, n, S! m
OVER_COPY_CMP:    ;复制完成比较) {% K. `- w4 o( i
LDA FLAG_OVER
- z( Q% Q6 G3 {" M9 b( y CMP #$FE    ;复制完成标志比较1 N+ {8 Z5 {$ O
BEQ DATA_COPY_EXACT
9 B) n/ H6 J7 l0 B
' }# X& ~: o' R9 KINI_XY_COUNT:   ;计数器初始化. W, g! D: ?7 U+ ~# Z) Z+ W
LDX #$00% J! ^: a3 x0 T! V+ t+ v
LDY #$004 H! f" l2 M" N: B7 `2 x# I: i

0 D% @8 S8 n* W  fCOPY_OVER_CMP:    ;地址比较" l* U$ f" \0 ?( p7 ], ]" w& x
LDA ADDR_FROM_START+ g, L" N1 Y+ T, c5 l
CMP ADDR_FROM_END
: F* ^! u7 v* e- ?8 p BNE COPY_START- D+ N! u4 ]9 [5 L' S
LDA ADDR_FROM_START+1
" N5 j# s) Q9 {4 ]0 d1 F6 k8 F CMP ADDR_FROM_END+1
( L* \6 k: k+ s/ ~( x$ I$ `! D BEQ COPY_OVER
: {/ J6 E+ w- \4 r 5 h$ I8 A9 n  J; |- N! _4 F1 y, O
COPY_START:    ;数据复制开始
1 t; P5 f& {, L2 q  P& q) |  y LDA (ADDR_FROM_START),Y    ;读取源地址
& H# W+ E1 f8 Z* n' m; j) }: y STA (ADDR_DATA_TO),Y    ;写入目的地址
. }4 l% S+ m4 ~- I INC ADDR_FROM_START   ;源地址低位递增
; _$ J* ^" L2 f' y/ r4 r8 g$ [ INC ADDR_DATA_TO   ;目的地址低位递增- u% z8 v6 A0 G9 T+ u# z2 `9 z
BNE COPY_JMP
3 I- x8 h4 \8 }5 c2 Y# L0 E' [ INC ADDR_FROM_START+1   ;源地址高位递增* X/ T5 q/ r% g. B
INC ADDR_DATA_TO+1   ;目的地址高位递增. p( `* V, h  Q3 c6 E) v" A  i

/ j" I2 N: i* V; L$ C+ O# n0 r4 GCOPY_JMP:   
! F4 `& D, t( t( n, t* ~9 T JMP COPY_OVER_CMP) i# @/ u$ p8 D4 r- K

: g; o9 K+ ^8 K! w0 U& VCOPY_OVER:    ;复制完成" S/ E9 L$ I2 W' `: ?
LDA #$FE
, g2 f2 t2 q: G* `9 U$ N/ f5 ~ STA FLAG_OVER    ;写入完成标志
) W/ z/ x# l+ s1 X' B9 bFINAL_BYTE:
" G' N+ F0 M9 f' T& n) S LDA (ADDR_FROM_START),Y    ;读取最后一个字节
) ^% s0 o" J: D4 x STA (ADDR_DATA_TO),Y    ;写入最后一个字节
  S, X7 s: k' C: }
+ w& W4 C' b7 |) `0 yDATA_COPY_EXACT:    ;恢复数据
- v4 @6 j# ]2 I- r5 Z LDA INT_ADDR' G0 a8 K+ [1 j- f
STA $2000    ;恢复中断
% D1 G' k2 ~* L# G: p) o2 k' B PLA
- V) b  K( ?6 ~$ q% I7 K STA ADDR_FROM_END+1! @! F3 R7 y9 t$ d( Y# z6 F
PLA0 t4 a5 K8 E8 a3 G6 ?3 e
STA ADDR_FROM_END
2 D/ o4 ^. A  ?$ H0 o/ a PLA+ r9 _( [. ~! L: H+ o
STA ADDR_FROM_START+1
* a6 b3 @$ z) L4 e& y PLA7 }" S7 H# S$ E! |
STA ADDR_FROM_START
" n( {! K1 t8 |# j& d/ i, S; ^ PLA7 ^% S/ n1 o7 `
STA ADDR_DATA_TO+1& u% ?6 E% p& N2 y( L9 o6 J  N0 l
PLA
3 O7 u  w; h) g STA ADDR_DATA_TO
2 j; M' |0 d8 z' I# I PLA
! Z  G/ z% H5 ]4 {& D TAY- m8 a* K& U) k! ^0 R( |
PLA; ^1 S7 C. e+ S# c$ i/ q$ V, q! ~9 ]
TAX
, N9 y6 s# J" a1 R4 e PLA
# B& s$ D- l( K7 T7 y/ b PLP) T( X5 c- ^1 m# q# W9 e; p
# v5 z7 z3 a% q/ p3 i

- C6 x6 i, k0 C  d8 Y4 K ; L% G4 |+ R* V  J/ d1 H: }
DATA_COPY_RETURN:
  @* [, @* o6 k7 y  H6 J RTS
, _8 ^$ _* k" i! c" m' J. Z 6 o. U* w9 D6 \
.ORG $C056    ;精灵指令覆盖6 j1 a' c: e" j: y
JSR $FFB59 k9 G: v2 a7 \; G1 {
( P: A& W1 C% @* Q% @/ f
.ORG $FFB5    ;& X. M5 @; h$ p3 V4 F. _
PHA
# W! e2 P: C$ ~" e3 Y  TXA: s3 v4 ?' I1 I, T: x) @0 |
PHA
) i8 @  a* O" m2 L: ?6 `9 b TYA" w. C% i7 A( b' p% o0 v) F/ K" @5 {
PHA3 V$ {/ S" h2 Z1 U. H
LDA $71FF    ;比较7000-71FE数据是否完成复制
; t7 x. x5 J2 {6 h* U8 V8 v CMP #$FE$ n7 k/ t( o' b: @2 O* U
BNE ADDR_FFCA" y: h5 `/ S3 K" k* \" U. \
PLA
+ s* J2 M9 G' ? TAY0 T0 v9 X9 t& h" c# {' Q
PLA2 w$ ^7 N+ r* c. K9 |
TAX6 B# \2 J. }0 ?
PLA% [% e( i4 n9 m! f
JSR $7000   ;跳转到自写程序0 U/ I& K! X' C* F
RTS
# F: x' w0 Z6 I5 f) V4 EADDR_FFCA:
) D  _/ ]. V4 p: R PLA
" k2 u/ C$ x& A" R/ H8 P* K6 p TAY. Y) v2 Y( x% Q5 R& l( _* @* U
PLA3 E( s1 C) ]- E8 l4 f. p5 T$ L4 d, [
TAX7 M( u9 I9 ?# J
PLA5 @3 A9 p9 i3 n
RTS5 d( U1 R4 R& ~5 ^
3 P3 u2 X5 n$ }3 H

1 ^* `3 @+ X+ j7 z1 l5 ^3 g/ ~6 e3 m/ E
.ORG $C264    ;自定义的MAPPER2切页程序
# Q: R8 H: [2 @0 L+ X PHA
! w( B! ~+ U! V# j+ Q# P TXA; E) d) [7 k" n) t, k7 T! S3 p6 H
PHA
/ X8 G8 @( `1 H, ~. I LDA $0066, M$ {7 U$ B% D6 g+ x
BNE ADDRC280
6 J7 L/ Y8 @7 L" _* ~ LDA #$07
; u8 A/ {, Y( c LDX #$039 q& I2 C0 E8 w+ d% d, F: c
JSR $CD9B    ;自带的切bank方法
6 S5 V0 {9 H1 c: A( C; O* A PLA- }0 _7 O( P( f5 E& k2 T- G# d
TAX
% g# Q8 K9 Z& H. I$ w/ T1 _9 q% `+ a PLA
- D( |; J( s, q. i JSR $80000 f7 x6 R) i8 f: i  d" z# y& S
LDA #$06+ O3 _0 g# D/ c$ m. m2 j
LDX #$03
0 X( \& X( b4 ]' _5 d3 f" p2 L JSR $CD9B    ;切回原该切得bank(可以不用)  L4 X+ l4 n, L
RTS* [1 Y0 v: ~2 q$ ^( c' o1 u" b' y
ADDRC280:
- Z4 \5 C1 l8 Z7 P) Y) {# K" [ PLA: g% H) X2 ?$ ]6 f0 z/ \
TAX
4 r7 [$ h* k: s PLA
' v  }9 ~( h  G/ S RTS
* b2 ~2 D- i/ E0 V  M8 v
+ m# T7 n7 J! w8 @/ I8 x/ [7 N9 D 0 M8 m8 P) F+ H
;[FC][最终任务PPU][END], S; n$ w( w6 p5 Q" ~! l
.ORG $C056    ;跳转到PPU重写程序( Z# a2 ^# V, Y5 H: }1 g
JSR $7000; x8 |: R# R- a2 I% x& }: L1 L

$ n1 l7 |; M) v' ~+ q5 z% Y .ORG $CEBF( K4 {# o- }0 `- R4 Z5 S' ?  i; c
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入6 M  r; b1 O- {9 I$ R/ c
  " {5 Y% }# q9 F+ f2 P$ o
  .ORG $E460- O; p5 [$ a& M$ w; ?
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
3 l) I  m" A" n! B  
% k5 S! C6 g1 u+ q, L7 P; z .ORG $71F0
. n' P( F, n  ~( S& r6 {STAGE_DATA_WRITE:, S/ U8 H7 {+ n- l- m1 S( C
  LDA $6010( J3 P/ a% k! p& {
  STA $1E    ;关卡写入- H' w( Z7 v8 u) w( n& I
  LDA #$00
3 n( E2 m! y. }6 F; C# A# \2 j( l  RTS  y# v) ], R7 {# N
.ORG $71C0$ p0 q/ z, P9 l, S6 r: ]
BULLET_DATA_WRITE:    ;副武器数据写入
  @' ^2 R* C$ n1 r7 I6 |5 H CPX #$0E
5 _6 w0 A: g' i2 A  U, X" c BCS P2_BUL
' d2 x( j/ p& g' ^. U0 |4 TP1_BUL:9 h! X+ q0 I, {
LDA $6004# s4 G) I6 U: w1 |3 ]6 T
JSR $D7D0    ;P1副武器数据写入
: ^6 C* J; I" y) t; w! ~ RTS  Y2 ~% t6 b' D: \
P2_BUL:4 r+ k1 |. _$ C+ z& r8 l% W8 b
LDA $6005, e; o/ M+ h2 E  K/ a2 G/ o
JSR $D7D0    ;P2副武器数据写入3 \5 `# g! o' H4 W
RTS/ A% I7 I, _: [

9 @- Y& h3 R% S) `
9 T/ h( X: j( J .ORG $7000
$ w8 n2 R' w/ Q5 ]2 h  
! B1 W9 V3 Q. F/ P, p STY $4014    ;补上覆盖的精灵写入指令
$ n+ h9 ~& y* `4 y, {7 y PHA
' N. H  Y- D! Y9 U+ U/ B: O/ P1 l5 } TXA
. [# `2 E6 C: m PHA
) A9 _. l; s6 P# C! x TYA
% w1 f/ W4 T* \! q4 c PHA6 j. E0 }8 v; d6 c) H* J4 O
LDA $0C
3 q( D. V( }1 h' W- b2 G/ F( X+ Y& T CMP #$01    ;比较是否为标题画面( g! j" p, j; ]; i+ Y
BEQ PPU_STAGE, o5 C. L5 D- j- g' l2 \
PLA
, k, i" J4 ~4 U+ Y8 A5 h TAY
# D& J" {! W& @: g' D PLA
2 W* E- N9 j( F, v; ?4 B" | TAX$ c; f( e' ~# D
PLA
" {+ S6 d0 v3 V% [' o RTS/ T9 u/ |0 j$ D% o% h+ `( P! k( n
PPU_STAGE:    ;STAGE显示程序  Y% `1 G& E$ p/ k
LDA PPU_ADDR_DATA
4 j' x1 [6 E$ u! A9 ^6 x1 { STA $2006: C2 Z$ p. e0 X0 P) H
LDA PPU_ADDR_DATA+1
; q5 L( d" p3 z  S$ m- J0 n9 b( q STA $2006    ;坐标设置
( m3 `, Q0 p3 @2 I; r( u% a# W LDX #$00
/ J0 y# z" U8 s0 p9 z* {PPU_STAGE_WROTE:    ;写入STAGE字模
5 N$ y5 T) k7 {' y LDA STAGE_DATA,X" i8 E& O. |$ g" }
STA $2007
- C! g+ `2 v- j( _+ Y. t INX
' l, o7 Z8 N0 v3 G. z7 Z& O5 h) k CPX #$06
/ ?; g: j) d2 i BCC PPU_STAGE_WROTE
$ c% X. _! N2 I LDA $6010& ]: ]  D. Z# O$ h
CMP #$FF    ;关卡数据初始化条件判断: w$ ^4 m9 j% Y- O6 ]+ \( \
BNE KEY_B" [. M- z2 W8 g; F
LDA #$00# h7 X( T* o0 e$ P' Y
STA $6010    ;关卡数据初始化9 e; c, U3 q2 p" I! ]1 E( [
KEY_B:    ;关卡减少7 g7 o& ^$ Z) K4 w
LDA $04) N0 y& v, |& b' @4 m- a& s
AND #$42    ;按键B或左减关7 }) F* X: z, k7 p! M
BEQ KEY_A1 ~$ W9 N- }7 f
LDA $6010
# ^- [* j. Y% ~" c CMP #$00    ;关卡比较5 {/ V* @8 }# V2 W6 _
BEQ KEY_A- k5 Q* F1 C+ D( a/ ?
DEC $6010   ;减关
& @* q- a7 X, n" `KEY_A:    ;关卡增加5 x/ k8 M8 `0 [& G  W/ z- Z% w
LDA $045 s  @# c( f) ?5 |+ H3 o2 d/ a
AND #$81    ;按键A或右加关
6 }8 Z, U+ V1 p BEQ PPU_NUM_WRITE4 ~, h( h% D# i; l2 r
LDA $60104 x- |; p* @& D, e1 r* g
CMP #$04    ;关卡比较
! W& y9 c* L) C4 K' u BEQ PPU_NUM_WRITE
% r9 g" o$ n2 m2 ~+ x INC $6010    ;加关
9 x5 d& X. f/ h& O* uPPU_NUM_WRITE:: I7 J* g' f/ P9 x8 S
LDA $6010/ L6 L1 ~1 b- e6 J  B' F
TAX
. O5 A* C9 A! e+ e# H# f$ E( c; \ LDA STAGE_NUM,X    ;写入数字3 {- ^9 b& g4 c( s  [4 ]' @: |
STA $2007
8 D% O/ h/ b" N. I; [4 _2 xPPU_RTS:
! @& a- K) j8 s$ D PLA
3 b2 w$ B: K: Y1 w# o& ] TAY! |) X' ^2 L% y, @0 u; O
PLA6 u% `+ F; V: H8 R8 V( V
TAX" K) C2 F( ?! k* s; ?) L
PLA/ j( n5 u+ U. k
RTS
' w* d2 k/ _8 j
' w( k* {- K. z& m3 H3 P% |
6 i4 V+ R: l- `& z+ OSTAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据  i3 Z7 N0 b9 B7 C; F) C
.BYTE $EC,$ED,$DA,$E0,$DE,00
+ @3 D* e8 M  }STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据: {/ g' Q3 B$ ]- Z$ Y" A
.BYTE $D1,$D2,$D3,$D4,$D5
( N; c; M# Y0 b4 }! ? 5 k# D( l# p( y* e
PPU_ADDR_DATA:9 r* S. j$ B+ i% U( y+ ]" ^9 U
.BYTE $23,$0C
% x: ?" o7 H; u6 K1 A ' l5 x( k1 p. ~4 d  r) ~  V: p

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2025-8-4 13:13 , Processed in 1.101563 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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