EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 . l' i' q1 _8 w# X; |( T: I
* v: a4 Q7 n5 [  Q6 |4 E3 n: m
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
) B6 R* {$ I3 g3 |! E) w  H然而,今天想到一个思路.
+ K* x6 L! p+ ~# T1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
* G0 r3 J  N3 R1 x+ j2 }. Y2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE: L2 K5 k8 B8 f! M; j' p4 f
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
( _; o) t& K8 ^+ k, T8 z  |& N. D  U! z; W) Z2 l# e& U

2 M4 U' f, v7 o# U;[FC][最终任务KEY][END]
3 A: q" U5 Q+ vbutton = $04    ;单次按键5 m6 n% A+ a( `3 e" T, y
flag = $6000    ;功能开关标志0 ~5 O5 F. |, [. i. v0 a
pause = $000E   ;暂停地址
: j; s3 q# T& Q8 G. r: _
  k( P9 f" Y- D1 Z .ORG $80001 ?( |! w6 r& Z
LDY #$08    ;自带的按键程序
; C; L* F8 V4 Q8 tADDR8002:/ e1 K4 A; b! n+ G/ A1 c
LDA $4016,X9 f3 ]* Q; G2 H% m
LSR( `( g& _* ]6 Y/ h  u( R4 ~+ i
ROL $0021' j: O: e0 G6 S8 Y% U, g% t
LSR
  m! p. b) \  G" M/ }4 w ROL $0029
8 G" t8 ~3 m. w7 X2 K2 W DEY8 i' |9 H' i# |# z
BNE $8002$ n, n& z  Q7 M. j0 o1 m3 K9 r
LDA $0021( a+ }1 u+ K: x! _$ C% B5 p
ORA $0029
9 z4 A# L( [3 |6 c STA $00210 u1 W- ?6 q- {+ G+ X) S  w6 }
LDA $0020$ o6 ~! X& H' `8 k6 m1 v
AND $0021
8 o3 h) w/ u1 s) G; ? STA $0020
. p/ \8 |0 y. N  c5 w. C+ p LDA $06,X
  `! r! d% d- l4 m. l7 Q( v9 z EOR $0020! g1 [, X" N) D
AND $0020
' @8 {& [* S( w3 Q9 M- Z STA $04,X- n4 Q) j1 m+ v
LDA $00203 A9 Z8 n; d0 |+ {" `) _0 g" x
STA $06,X$ r! G0 K  _. z  ]
JSR KEY_OPERATE
4 L9 [5 W4 i. K" h' m$ n, n JSR Function    ;功能调用
7 H2 c# @( M6 y JSR Weapon    ;武器切换调用" Z1 y' w: v9 a8 z: S# ^  T
JSR Power    ;威力调用4 x$ z1 S3 H% `0 m1 j3 j. q3 A
JSR BULLET_NUM    ;子弹数目
4 `+ x5 z$ {4 |% n, y JSR BULLET    ;副武器类型% |2 n4 B+ M+ j( h3 d! B  I- `
RTS
* K% b$ U% X" e5 _' M) u" C
1 U  G$ @" ^' e& O & a, e' p# |, X4 X; R  `

# F1 r) Z) Y' S. l0 y% O8 Z- X .ORG $8050' @2 q0 O9 P" s" z. n" ^
Function:    ;功能9 E. o) B% |/ j
WUDI:    ;无敌5 _+ @' ?# y1 f8 V6 e) A# n
LDA $6000,X
7 X7 o6 H/ @5 a  ~2 y# y. X% ^. E7 a AND #$08    ;开关判断. O: C) T  j/ h3 p) `7 \
BEQ LIFE# [" E* b, M- d! e% _) E, R" E: X
LDA #$05
) k) \2 O! w6 R" U2 [: }6 | STA $05DC,X    ;无敌锁定: J, M9 h5 E, T' s' k
LIFE:    ;生命
1 ], N: X/ x0 j/ Q LDA $6000,X! F9 y9 R: C0 h
AND #$04    ;开关判断) T- x9 k0 f) u, o9 L( _& m% a
BEQ FUNRTS3 I. b% T# |5 I
LDA #$05
# t/ d# |4 o$ H+ T% S' r! i% ^ STA $1C,X    ;生命赋值, a+ I3 y# P2 ]% D$ v, R+ O
FUNRTS:8 s& y. U  |4 d  j1 l9 @
RTS
. f7 d$ u( G: X# ] & ^4 o$ p! U; ]
Weapon:    ;武器切换* T/ F4 J3 X5 c! D- N' g9 ^
LDA pause    ;暂停状态判断
0 Y: o2 o" m9 `6 N0 | BNE WEARTS8 C$ ]) W7 r% y! J* S3 i7 G& q/ T
LDA $04,X1 u; i, d2 H1 l/ G
CMP #$20    ;选择键判断
: M8 O3 R- ]& w9 ~- W* E+ o- Q BNE WEARTS3 n1 W! R5 G: G- b8 d
LDA $12,X
' l4 m9 h8 Q9 S4 A, y+ ~5 k; l CMP #$03    ;武器值判断
% L4 m, n0 v/ i$ ?' w BCC WEAINC& E5 Z6 S( F5 K" \" j: Z# ]
LDA #$FF
: k- h( g" a( p& @4 a  L' e. }; q STA $12,X    ;武器重置. a) d1 W% l8 V5 Y6 _
WEAINC:* g. C6 x1 B( z) X. ?, C
INC $12,X    ;武器增加8 O$ K6 t; Z$ r' }, k# a7 F
; }9 |$ W; h# C6 u8 m2 n
WEARTS:
6 H) }! y3 n( ^5 e; [) X/ s0 R RTS, n, F, `. }' V7 _6 S  M; o$ z; p# G8 P

: p3 Q. n2 }8 V# g' n2 m' YPower:    ;威力6 ~) }4 u6 ~: T1 @0 G# K
LDA pause    ;暂停状态判断
( ~* V4 d) Q8 l9 A0 M! q BEQ SPERTS
3 ~) j# m* s0 t4 r9 }9 M8 O# hBUT_LEFT:8 G! v* X* D9 g  y/ s& D% g! {
LDA $04,X
& c5 y6 t2 D6 N3 |! b CMP #$02    ;左按键判断, Y4 g0 E/ ?, [+ v6 i/ ?
BNE BUT_RIGHT  t3 c( L* Q, w$ [% |; h$ Q8 j
LDA $88,X  b; H7 E& A) q* K& P  l9 H7 X8 {
CMP #$00    ;威力判断
7 H6 G: Y) w$ ?) J( t# C% n, P BEQ SPERTS
7 w, {" j$ w( n4 d1 Q: F. nSPEDEC
( R: w/ Y; c7 Z LDA $88,X    ;读取武器值3 }- k7 U+ _8 @. T9 i4 h$ p
SEC
- h: b4 k0 x# r6 r9 x- W  u SBC #$08
/ L# q, b8 `" q+ E# l' I STA $88,X    ;威力减小9 u" i5 ]( h( s/ n1 j: V/ Z, _
BUT_RIGHT:+ R6 l+ m' N0 y2 f. b% N% O  M
LDA $04,X5 ^. @4 A  t2 L. o
CMP #$01    ;右按键判断
3 e- q$ }' M$ [2 @ BNE SPERTS: i5 ^9 J/ h; s1 Q6 b5 T# B
LDA $88,X: q: I" s, m7 ?: m# u9 D9 l
CMP #$10    ;威力判断
; G- j' x* U% {% {+ P2 Q% |+ T BEQ SPERTS& u+ G8 |2 N3 a$ p  {; U. h4 n
SPEINC:9 V0 ?+ D/ Q. y6 `9 c" S5 C5 J
LDA $88,X    ;读取武器值4 l9 k  ^, D9 J6 L  D6 y/ J; E. @
CLC
$ X* j! u/ U5 x2 ~/ a" [1 z ADC #$08# J3 z$ z% {/ h6 N( \
STA $88,X    ;威力增大) D! @6 ^( |$ C
; g8 v! Z4 v4 u5 t' {
SPERTS:' n) |8 j2 m1 d% a  q2 W+ m
RTS
' ]$ V% A& W# x( y& [7 L/ h) n8 \6 y$ B+ B$ k( E' e
BULLET_NUM:    ;子弹数目
1 n7 a. [3 J9 Y  d( s( I LDA pause    ;暂停状态判断) u; }0 n, q7 R! z6 M$ Y
BEQ BULRTS
) |9 e% i/ z0 E5 j2 e( |8 u; ~6 v CPX #$00    ;主机玩家判断
# Q  p$ A- l: |% z' O0 N, h7 g( c BNE BULRTS
! e/ ?2 c) y4 J6 O2 [ LDA $04,X    ;主机玩家判断
5 ?2 j* |0 {. D; q# ?& D2 [ AND #$80    ;按键A比较
  o  s: r6 R) v! ?% a: _ BEQ BULRTS6 X# G$ K! P% r. P9 n
LDA $87    ;状态判断+ P/ @; m! q# T& g  S- [
BEQ BUL_28 K; h; ?% y+ ]2 d) Z0 x) z7 ]
BUL_1:! R; v+ W0 Z3 n$ m/ u+ r& [. O& T
LDA #$00% g4 f" m! o) m  a
STA $87    ;1发子弹
7 L) B0 b1 a! ~ BEQ BULRTS
1 y+ r6 f. c9 ^  A6 J( ABUL_2:1 f! e4 i$ V$ k- [$ Y  w& v. ?. T
LDA #$01. G! n  y3 x$ D' R- s, |5 A" L: U
STA $87    ;2发子弹8 H1 {. k  J6 R1 c
5 W5 B; h; ~5 K# X- n0 d# ~
BULRTS:
3 H" \+ j( I! [& V( e4 ^+ ` RTS2 G- L5 x/ C5 t- f2 {& T1 v

. q8 C, e9 y) E8 B% b. t" ], ^* G' p) E1 k2 E
BULLET:' i+ _$ f1 |1 {0 [7 y
LDA pause    ;判断暂停状态
3 Y; {7 _! H8 ^. _ BEQ BULLETRTS
7 i5 b- o: A- k4 A0 ~" J3 G- l LDA $04,X1 }( F- {$ e4 Q2 E# A0 T( l
CMP #$40    ;按键B比较
9 O& c* [- l5 n9 H6 h* Z- h BNE BULLETRTS
) x+ [* h5 g- x$ Y$ ] LDA $6002,X    ;读取副武器
) M1 e  d, r; V* f, y/ C( D) U# l) O CMP #$03' b4 a0 X" @8 W9 B; ^2 b( c2 ^
BCC BULLETADD9 {& S4 O! f$ h& }( ]0 O
LDA #$FF4 ~6 o) R9 S- N. C8 [0 F4 z
STA $6002,X  G: a# v0 h2 e: u4 E. w0 }* S
BULLETADD:
1 F* L+ s; i% p INC $6002,X9 N6 C% P5 ~0 f( k

# H' \0 x) j) r% a  _$ IBULLETRTS:# ^4 V' v4 X+ w" y1 |
LDA $6002,X, H  G0 m7 g' G5 x: Z8 A$ Y" n
TAY* b* p& h9 V) l' v3 o3 D) M0 r
LDA BULLET_DATA,Y6 X# ^+ A- q' \5 @7 b
STA $6004,X    ;写入副武器数据; \; D7 U; x' Q2 i- T
RTS8 f% V4 T! c% n! B% f# ]

) J1 l* n" I( B* }
* w, H( U5 i' R9 ?BULLET_DATA:
' M2 [8 J5 L& E+ R .BYTE $06,$02,$03,$04
8 ]$ O8 t- p* r4 @& u. d, U% _7 L 9 _( F0 S6 m1 U2 j* C* F
+ ^0 M, M+ H8 q" q3 i0 P0 ]

0 `& A2 n8 u, OKEY_OPERATE:    ;按键开关操作
6 b6 G9 Q" j( \* v! ~' \, F1 Gdata_protect:    ;数据保护: R. f( q; z+ b8 H! q- U/ t
PHA0 ]7 z8 |3 ?# v: v6 t. G0 p: r
TXA
  F6 h! c3 J! |! m  X PHA
7 u* y  `* z5 G- ^ TYA
! T" G4 X: d. u PHA. `0 f" r6 _7 W8 X( V
, G' n7 S; ^$ M( c2 I4 F& d! N7 O
FLAG_INI:    ;开关标志初始化
$ y" l( h4 U/ J" O: c' O
9 {- |: z4 L2 m& p. ^0 c% ^ LDA $600F
7 O0 O9 f( ]4 ?9 o* F. I CMP #$01
3 k) r( Z% {- Y7 L- h' U: D BEQ pause_cmp
9 T- n7 n# y) m, G6 V- J' J1 t LDA #$00) l! W. Q+ k4 N
STA $6000
: o6 h; D! y/ |& D& b STA $6001
; o0 C0 x% Q. m. H STA $60025 ]5 A  j, j: F( _
STA $6003
( F; b9 P8 g* F! A% } STA $6004
$ J4 h& H6 W+ d( ~  o/ i STA $6005
& O9 |( A, I# d9 d LDA #$01
' A- h8 g% q  N% s STA $600F0 O2 P  z) ~# S4 e! w. O8 E% R
' W4 P& y' X# ?
pause_cmp:    ;判断暂停状态
" j; t$ C% j2 Z8 |/ B LDA pause+ b; C5 x  e) ^  r  G
CMP #$01    ;判断暂停状态
: A* H6 w+ o1 ^# H( c6 p- A BEQ button_press
) `& N$ H- }) h" R# L PLA
2 m. Y4 z  g" D7 S+ k TAY
" J. V/ q  W" M9 f" j* t% M PLA
4 R2 M% Q% ^% S TAX
& [* z3 `6 G$ V0 i1 [8 `* U PLA0 p0 H$ T8 q! S8 _; C
RTS" P1 C/ k! h. t$ Z6 \  K( Z
# ^2 W" e9 t$ n
button_press:    ;按压操作
3 J/ O1 X1 K8 P  C! v& O8 tini_Y:6 l  _3 f% ~' m- h# ^
LDY #$00
% N8 l( e  i9 G2 abutton_cmp:) Z! F, ]( G3 P* J
LDA button,X8 K" L3 I  @. e* N
CMP ora_data,Y
8 k4 P- U, j3 ^' _/ M3 E BNE count_Y_cmp
/ [- q6 \- Z9 u! o! rflag_cmp:
3 j1 U$ Q* t2 U# L+ p7 } LDA flag,X
% f9 I: V- N3 Z. X( x AND ora_data,Y7 J$ t* [/ V; a: m
BNE flag_and
# d- q& H0 g/ s' G# V4 G9 yflag_ora:3 Q1 {. e; _% b9 g( z: c* e
LDA flag,X. C- j$ [& S6 j
ORA ora_data,Y
  X& I% w& \# P; V STA flag,X- q- S" V6 p& B3 d
BNE count_Y_cmp" a; {0 j2 c6 |2 M
flag_and:4 N) }5 z: {0 M/ ?; d
LDA flag,X
# [# F( ]; o" w/ N AND and_data,Y
$ Y9 }) L3 m6 y# z2 x STA flag,X
1 S" Q# l( g2 W' [0 u- [1 {! xcount_Y_cmp:
% [& P" m" g  R2 Q; k2 K INY
" @8 i% B7 [5 `- I5 v. n CPY #$08
3 V: d) \5 Z- P5 l) E0 N' V1 v BCC button_cmp
7 L# T4 }' }+ H2 @. O: M4 B* b
0 N! J+ U! V" f4 h' [data_extract:    ;数据恢复% z1 F' X9 M# K9 R
PLA3 l/ H/ X/ S% S$ }" k
TAY0 i+ n: o& J6 C6 n
PLA
2 c8 p3 Q7 G' T! s' r0 u' p TAX# C! y: X" U6 V  V
PLA  ]) w* I, l5 D6 G5 k" Y; O

& {/ ]# o! d4 w) I* Xreturn:
! _0 F' o0 F0 B0 M RTS* r) J* @. b0 u) b
% D4 m9 f) r" [$ G1 @; B
ora_data:   ;按键相或数据; g3 P0 l, _! O$ K% P5 @3 Q$ T
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
: F3 B2 `8 K3 r1 i. iand_data:   ;按键相与数据
# V3 R. I8 {4 n' l2 |9 s .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF- M6 u! s: v0 e7 v3 \& D! ~* b6 n
3 l5 n& ~! ^$ q0 u

  D3 \5 }9 n; R! Q* S* _! R , f2 J1 Q  {6 m: O
;FC数据搬移程序 BY FlameCyclone
: M* `; P/ v7 f, ` .ORG $8200
! k8 y& l6 g* @, V& ^# j JMP DATA_COPY_PROTECT. e1 j3 t1 \$ S" ~9 T8 t
, F2 `  d& F+ i5 B- @% \6 m. g8 y
ADDR_DATA_TO = $40    ;目的地址% Y/ z4 O. _) u6 u3 _& e0 k
ADDR_FROM_START = $42    ;源开始地址
1 b8 Z: g5 P* }% R. @ADDR_FROM_END = $44    ;源结束地址' D$ @, Z$ J8 k/ x

' i  e9 |! z& B, ]. H7 LADDR_TO:    ;目的地址1 q! i5 T$ ]  M; o9 j
.BYTE $00,$700 W4 q6 J- S& b$ q3 l4 O, p. R; q
ADDR_BEGIN:    ;源开始地址
+ G" F" b( ?7 y9 | .BYTE $00,$83; a4 r* N: Y) S2 J( j7 m* r6 _
ADDR_END:    ;源结束地址% _9 ~  d2 J% |1 |
.BYTE $FE,$84
) L! R7 _& q: u- s9 R  }+ ^
8 v2 h- g% V! L: z- |( C$ rINT_ADDR = $08    ;中断地址
5 ?$ R3 {6 q4 k2 d! vFLAG_OVER = $71FF    ;完成标志( n! N# m" F2 l! x

4 m1 W$ |/ p/ v+ w: m$ `! o
% R7 @7 P% X/ sDATA_COPY_PROTECT:    ;保护数据
' {5 M' T' q: n) s3 d3 Z# U PHP4 d6 k: P& c  T' a1 m% U& O
PHA+ D7 j# a$ X" c5 K
TXA
' ]3 x9 w' |- f: b: K+ ` PHA
2 @2 X* {/ E8 H" q4 A TYA* f; T+ b: j* D4 B* G! c2 l
PHA
9 s, [' Y$ M+ w LDA ADDR_DATA_TO" D5 N5 P, A. W/ f' n: t
PHA
9 }6 |/ V# m: z LDA ADDR_DATA_TO+1
! M8 v7 h: A- I, j PHA
1 s; O2 Y& |; g! }: `& F9 K LDA ADDR_FROM_START8 V/ S+ u5 ^" f+ V3 p+ r. E
PHA
1 c9 K2 V0 v( L, t" a1 k$ y LDA ADDR_FROM_START+1) g% \! r; M5 A' {) c( f
PHA- R3 A9 C& r9 O) _4 g0 a3 n/ Z  w
LDA ADDR_FROM_END
: d& v/ v# L8 M+ U$ ?5 M2 w) t PHA
; \, R" D/ a* L; J, E0 @* E/ ` LDA ADDR_FROM_END+14 |5 ?! w' C1 A7 }* _6 S$ `' a
PHA) G* U, R; a  Y3 O, |* |" S

9 ?( Q7 h8 z+ V  N! ?' F$ zOFF_INT:   ;屏蔽中断) @! ^2 p% i3 k
LDA INT_ADDR
- K9 Q# r& Z8 I- f; f AND #$7F
( c( T/ ]7 v, s( |5 T! r9 G STA $2000    ;屏蔽中断5 ^+ I, f6 o) ^1 U: |* I

5 }" m% t, z" S1 u# N
. t6 ^9 y; p( ~' t* l  F: USET_DATA_ADDR_START:    ;设置复制起始地址
; m8 D/ M4 T+ j; k2 Z+ t: e% v3 ~ LDA ADDR_BEGIN8 T: l' ~7 j8 ?7 \7 n
STA ADDR_FROM_START    ;设置复制起始地址低位. ^; g/ l$ P# H
LDA ADDR_BEGIN+11 F5 }) g* R  N* {
STA ADDR_FROM_START+1    ;设置复制起始地址高位
3 l9 [/ ?' G; P 9 a+ J' E; f4 [& ^. {4 f
SET_DATA_ADDR_END:    ;设置复制结束地址7 _+ z; k& L6 D
LDA ADDR_END
2 n: `" m7 N: } STA ADDR_FROM_END    ;设置复制结束地址低位
. y/ e* S* K2 t0 f) y2 T( | LDA ADDR_END+13 v& d5 n2 g# U; [' |$ D
STA ADDR_FROM_END+1    ;设置复制结束地址高位
) B4 ^5 p' ~, K5 e  x 5 n" c) {* S0 I! R
SET_DATA_COPY_START:   ;设置目的起始地址
+ X; ?" f' x& \% B! `0 y6 | LDA ADDR_TO
; G3 T+ y4 f8 T0 \3 _, A' v STA ADDR_DATA_TO   ;设置目的起始地址低位
0 N% |# J9 p7 w+ [2 v; S, q/ o LDA ADDR_TO+14 M8 L+ V& ^+ ~; K6 a; e2 {
STA ADDR_DATA_TO+1   ;设置目的起始地址高位! I/ q0 c* i  R% l. m% ~

+ w, i% D+ B7 F( pOVER_COPY_CMP:    ;复制完成比较6 x. y2 I7 O/ x6 P' X0 H4 ^
LDA FLAG_OVER2 {& y. ]( [7 F3 k9 i6 r% y( v
CMP #$FE    ;复制完成标志比较
% M  ^) [- H1 p$ Y% | BEQ DATA_COPY_EXACT
5 m: X, Y, h* a0 b' ?$ N: V. h6 x5 V: c3 a
INI_XY_COUNT:   ;计数器初始化
+ O' c$ L( D" b+ K LDX #$00; S0 H+ `( ?$ q3 [7 Y
LDY #$00
- H' `7 V/ S( M$ r* n9 g, ]/ b5 w
+ E3 |4 q" @! F$ [! QCOPY_OVER_CMP:    ;地址比较9 y( e. B- _9 W7 P
LDA ADDR_FROM_START/ J/ x) v5 M1 X* _
CMP ADDR_FROM_END7 q/ p. T9 c- `, u
BNE COPY_START
& L5 L( n7 b" R3 t5 b; X LDA ADDR_FROM_START+1
3 v7 {1 m! L& y$ \9 p CMP ADDR_FROM_END+1
; Q& r' N1 ]( q# ]' j BEQ COPY_OVER! O1 F* ~6 f' `7 w% j+ S

1 Q4 j1 D& j' q- j+ a! RCOPY_START:    ;数据复制开始
0 r' S$ W4 A; o* J LDA (ADDR_FROM_START),Y    ;读取源地址+ }7 Z# i5 Q5 C8 H  P* @5 H" K0 B7 S3 W
STA (ADDR_DATA_TO),Y    ;写入目的地址( s# T1 G! {2 N+ n3 E7 k# n
INC ADDR_FROM_START   ;源地址低位递增# Z! G7 \" O$ ~$ H; `: w) w
INC ADDR_DATA_TO   ;目的地址低位递增# \$ `/ b1 E3 Z" T6 c
BNE COPY_JMP
6 N. {8 i* Z' p4 I+ o INC ADDR_FROM_START+1   ;源地址高位递增
% e; e: O$ ^! k% T INC ADDR_DATA_TO+1   ;目的地址高位递增
; p  R9 j$ W+ S$ f" D* ` / w: u1 }7 G# `/ u! q8 `7 i
COPY_JMP:   
( l( x; q& b' R  F  t7 C JMP COPY_OVER_CMP; l! o' Y4 O4 n1 g3 ^9 s
, |' X& U. d3 A9 O
COPY_OVER:    ;复制完成  x. T2 d$ R1 M  B
LDA #$FE
9 P  j2 d8 G4 T, u7 | STA FLAG_OVER    ;写入完成标志
6 `* c- Q  \$ R0 n* @2 {FINAL_BYTE:4 r; x, }. Y7 q* S% V7 Y
LDA (ADDR_FROM_START),Y    ;读取最后一个字节$ \) e7 A6 O( o- C
STA (ADDR_DATA_TO),Y    ;写入最后一个字节
7 v9 ]+ t2 K1 K  c 7 h/ t- {3 |6 v
DATA_COPY_EXACT:    ;恢复数据
% N! _% ^3 V4 S- `3 o) A. _/ o LDA INT_ADDR. B+ b, L+ n/ n" {
STA $2000    ;恢复中断
  S: _1 }0 D7 C) y1 ^ PLA
5 \& ?/ c6 u# _) z4 U STA ADDR_FROM_END+1% |+ a$ }  A" R4 b  q0 ^
PLA
7 X8 |, E0 i- ^/ d' X0 Q# ?- d: a STA ADDR_FROM_END2 @# x  ]5 K; |& y. D- \
PLA
. p$ N( e+ `0 G6 P5 [+ M7 O STA ADDR_FROM_START+1
# q8 v  e; o7 M PLA
3 p/ B* \, r  l9 J0 g STA ADDR_FROM_START
. i- r' w  f' a; H PLA8 n& {1 O5 A3 V6 u
STA ADDR_DATA_TO+1+ e6 X0 d/ v8 I
PLA
9 y# n6 M% ]: g4 l2 ], c STA ADDR_DATA_TO" L+ [0 ~3 j9 t/ f, e
PLA1 p/ A$ I1 m0 k, I# ^
TAY
1 s, z7 d6 O6 r# @ PLA
7 v' c1 i  @# A- n5 C) n. W: f5 a9 I TAX
2 P& A- E- r8 s# U5 D( o4 P PLA
. o3 Q; ~$ ^2 C, r PLP
2 P; S/ C) ~8 ] 6 B5 K2 q' m3 G$ m) Y  Y

$ K  e! m# d* h9 P" ?
8 H5 e; G* |- T  G# A3 sDATA_COPY_RETURN:% c- L, B7 k  K- P' c- {3 O
RTS/ G2 i8 `& `2 j) P) }
4 c! Y% M6 n( j
.ORG $C056    ;精灵指令覆盖7 F6 I. |7 J& t# p! o$ ~9 D- Q) |
JSR $FFB5
, s' t- R& b( ~, `3 s% Y  p, @ - c9 @4 B; c& Z# w" N0 D; q- `+ |
.ORG $FFB5    ;
( x( u# Z& s% w PHA2 j: Y. f" F! f9 j0 Y+ c
  TXA
1 w3 m: U. U& f+ g PHA; O6 W- N  _$ V
TYA6 f9 @% L- u# {# y2 K3 ?; l
PHA% V  h: \& C6 I( M$ }& f4 @
LDA $71FF    ;比较7000-71FE数据是否完成复制; s6 _" p' H% B, V# {, ]
CMP #$FE
( Q0 z! ?4 @4 d, h+ N9 \$ F! r BNE ADDR_FFCA
. Q/ F: Z/ d/ ~( L5 b/ N& l' P% N PLA
. H5 x8 X: v5 L5 K" ?7 o TAY
4 J' v6 f  {. j% I$ R PLA
" F  L# w  C( ~3 p0 H5 s+ A1 j* Q TAX
0 }1 |( l( s; V4 [+ T PLA
; P3 d. r* E6 K4 i1 w# Y JSR $7000   ;跳转到自写程序$ `2 l2 [( t: y/ p3 i$ l
RTS+ O  k+ E& |7 m
ADDR_FFCA:
& B5 ?+ u/ C: B* F4 W5 |( L PLA& n/ F+ a% _. {" L: n
TAY1 H  \4 s6 O( G5 A
PLA( g* y) o( a+ r' @( u+ O
TAX
# X: o& b$ G; S5 G6 U2 @ PLA
( A  V% ]$ T2 C RTS' q2 J2 u0 |- T* j$ B  ~0 G
; l2 a. m) s9 U+ ~2 B0 N9 a1 G, F
+ t! t' S# V5 I9 @( C; T
' W6 |! o" q/ v4 f' A8 ^
.ORG $C264    ;自定义的MAPPER2切页程序2 W' `4 {* [9 c
PHA
) n: _3 s5 E8 a3 `  }3 U TXA4 `' ], ]8 h8 J/ H- V6 m
PHA
  J: W. n" ]+ F6 t% V' l9 _) N LDA $0066
$ |/ m& P8 M! f BNE ADDRC280. k% [3 H. K6 @: j, z
LDA #$07
/ C6 X. `: Z, X7 ^ LDX #$03
" D, a& q3 E' `9 i7 U8 M( R JSR $CD9B    ;自带的切bank方法
6 M# V6 l7 O: G! Q PLA. \' g* A; |, I$ h" Z9 n5 G
TAX
# y5 N, X& U, r8 W! ]  C" c- x3 y PLA4 G1 k! A: X8 p: t- h
JSR $80002 u( m) f, u) J& E0 ?2 }, Z4 V: K# Y3 V
LDA #$06- L1 w7 F$ G6 ^1 C" r# g& E! q
LDX #$03
& c8 T; {* w/ d1 H/ K9 e JSR $CD9B    ;切回原该切得bank(可以不用)
0 Q' E; b& ]* [6 m/ w% x RTS
" V$ d2 K5 p  R/ H2 A, MADDRC280:6 ~$ o7 j  M; o% ^7 b
PLA
8 ~" {- A- h: B$ S" a8 J5 C TAX
2 B- I1 l9 O, w' P" c PLA
3 ~' f  i! _+ g" R, `* j RTS4 g, O* G$ K+ z3 s( [7 X. b
: J5 v7 J% ]1 W$ E5 H. i

  h. x3 j. M& K# A7 s# r;[FC][最终任务PPU][END]9 j. H/ [: D9 o0 E+ N
.ORG $C056    ;跳转到PPU重写程序
1 f* u9 E2 W/ g6 E; x JSR $70004 s$ U( f: v$ l1 D
! d# R& h) q6 q0 q/ F- T
.ORG $CEBF, z, p/ c+ P1 ^0 s, t
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入$ R; o  C0 M4 b2 c/ _, w
  
( M/ g; o* j. M- b  .ORG $E460
+ Y8 {; A" ?' @, l5 L  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入# X; ~' J( P* l
  
) y2 f! c! d8 W; _ .ORG $71F0
* l) o) g& T/ ]+ ]* h# U2 fSTAGE_DATA_WRITE:
* T2 |2 e% h( m- C) N* G  LDA $6010
" e( K4 c/ l  \5 n  STA $1E    ;关卡写入
2 [3 A1 J1 p* J0 l/ U9 q  LDA #$009 O% T4 U2 c3 V/ v
  RTS
* D& w3 ?$ {  a! j .ORG $71C0
; G3 K! P) Y- IBULLET_DATA_WRITE:    ;副武器数据写入
2 L5 a# L- X7 }% Z3 K0 P CPX #$0E: h- a7 G7 ^: ?5 _* M) L- {
BCS P2_BUL
: P8 [- }5 `. I: d" \P1_BUL:
, c* t% G+ w4 j2 A, ?% d LDA $6004% J1 Z4 n% ]& y
JSR $D7D0    ;P1副武器数据写入: p0 F0 Y3 y3 m. h% T
RTS2 f, k; X; n% H+ e- F( I8 K4 k
P2_BUL:
1 O% j# q' `0 `3 M1 U0 v! J8 l* n LDA $6005
. L& I1 Z  q) | JSR $D7D0    ;P2副武器数据写入% l8 o+ _& O4 ^9 _4 N" c" ?
RTS2 A7 Q# z0 Q! d. J0 Q! B+ A

+ R3 @7 _; X6 I, i. m8 y
; v! p: K( B% J9 ?. N' P, x% e, ]' X .ORG $7000+ q% i2 ~' b- x: x& |4 U6 ]! [' p; ]
  
! q9 _6 t6 S# O, R7 Q# C* U/ a STY $4014    ;补上覆盖的精灵写入指令
. z* w& E; e1 B7 J' t3 z PHA
, s# ]1 ?6 E6 R TXA
% j$ ?& O# s7 o: l2 [& t1 [ PHA7 N! A% Y5 z; v" B
TYA* }+ K# R% H0 I1 h
PHA
2 Y" X! P6 S( I LDA $0C
; a2 ]/ T( u/ K0 s' I' K& J2 A2 H; ? CMP #$01    ;比较是否为标题画面7 c; b/ G9 u1 k+ G' s
BEQ PPU_STAGE9 `. B4 q7 f; q4 ^* ^
PLA- G- h* E4 x5 N+ T' B; P
TAY1 J; V# q- {: N4 b0 J
PLA2 S% P5 {' R* Z9 Q$ {3 h
TAX
7 D4 }7 I7 _! ?2 E# w PLA, R5 u9 F; f; [( w; U9 n
RTS1 N8 L" X9 [4 Y# f0 B  n) L% P/ Q
PPU_STAGE:    ;STAGE显示程序
7 ^! u4 S3 |$ i' J, C7 l1 h LDA PPU_ADDR_DATA
# J' G2 g+ e0 J2 s STA $2006
/ r7 B' ^* [- B1 |# q LDA PPU_ADDR_DATA+11 u* t# Z3 A# Z
STA $2006    ;坐标设置8 [1 V2 h- t" D, m4 H7 k/ Q
LDX #$00
  G& }  d( r0 T; jPPU_STAGE_WROTE:    ;写入STAGE字模4 a0 b3 U7 B7 L
LDA STAGE_DATA,X
8 @- @; C0 c& x4 M0 c: i STA $2007* I2 Q0 _0 d2 O: S. X
INX0 f: H) B& E% g7 d6 B$ Z5 g
CPX #$06) R/ v* K  a+ p8 `  ^! N. z
BCC PPU_STAGE_WROTE% B/ R: O/ o! m" B7 l' S" g
LDA $6010
7 _( o; G. u% O0 S. R6 C# a9 G9 R3 }7 a CMP #$FF    ;关卡数据初始化条件判断
7 `" p; g! I/ X% F! A BNE KEY_B! l# D# ^1 {0 p+ o8 b% z) w
LDA #$006 Q' j, U$ @7 Z: x
STA $6010    ;关卡数据初始化& p8 y2 S4 _: s* Y9 b, C
KEY_B:    ;关卡减少
8 ]& s# ?( P) D# J LDA $046 }6 h  `2 g& a# E0 [2 O' D& z
AND #$42    ;按键B或左减关+ C. Q/ R1 a$ \" p  T
BEQ KEY_A8 T0 g! [$ @9 {% N7 [
LDA $6010
6 m4 I9 H* a. j( @4 M CMP #$00    ;关卡比较
  \2 C& n, j9 G3 d$ @- E BEQ KEY_A
- \+ \  \6 x4 f* R DEC $6010   ;减关
' O6 t" N/ L( k" K2 fKEY_A:    ;关卡增加9 d' o0 T. ~2 G% n8 Z" [
LDA $04' h+ a2 K1 N2 P& e
AND #$81    ;按键A或右加关5 ?5 `8 _0 y% v8 N! ^7 ^& z6 [
BEQ PPU_NUM_WRITE& P" O; c: S! n3 {
LDA $6010) h: s4 A8 p  O. j5 n/ e% N+ F
CMP #$04    ;关卡比较0 r9 T" ~" p+ h
BEQ PPU_NUM_WRITE! ~: Q- [1 X. Y, h
INC $6010    ;加关
! H3 m2 M2 f9 I+ x% B, BPPU_NUM_WRITE:
7 @" a. A1 p. q, p- m- i LDA $6010
+ W4 Z( w8 w9 J5 g" w2 A1 c TAX
9 D9 ?, A9 E; x LDA STAGE_NUM,X    ;写入数字+ h/ k; m! ?% h' {+ _' f0 h! d8 }
STA $2007
1 g( x( B0 O: A! [  n: u0 e5 N- ?: APPU_RTS:* A& j1 A4 I, [4 \7 |0 r
PLA
4 x0 f8 {7 c) o# v0 T( `6 c6 Y TAY" E6 w1 ^' Z! m& C
PLA
7 u: v5 `6 \, ~3 |& y6 H: S TAX
1 u) M# N$ J0 ~: v7 o# C/ w; i3 V$ B PLA( F3 f0 @  D" ^9 k/ w
RTS
6 [4 V; ]% ^5 p( T+ s  l& Q
0 P. l- c+ I, I% c! p$ g ( c( O% K5 ]; {
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据2 N9 W9 G7 j5 k( @0 I2 y
.BYTE $EC,$ED,$DA,$E0,$DE,00
3 F( D1 J4 O: a4 `; e* FSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
2 s2 ]0 U: J" O# j- H( A8 r .BYTE $D1,$D2,$D3,$D4,$D51 A0 A. e3 d) d( k

8 ?; q2 K1 L* ?1 b- o. s+ p% BPPU_ADDR_DATA:
% w6 p2 }: ~8 o .BYTE $23,$0C+ ^# }$ J. O. e9 W

1 F4 c/ m/ }8 h$ q* w  M. g

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2025-9-16 14:43 , Processed in 1.061523 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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