EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 $ i7 K* r( |8 [- C3 g$ X" u

: ~7 Y/ j2 [+ d- k! L& _. j' Q得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.# }  K$ Q  D# Y9 f
然而,今天想到一个思路.# o+ C3 g" ~8 O) |6 i1 W
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
4 d; r" @( D, e! V, |/ h2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE/ I* w) M. s& B. W' c( `
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
8 v" A; y5 f2 n, G, E0 M" M8 ^- N! [- _. \7 `
% T  P$ L' v7 J' G& P
;[FC][最终任务KEY][END]
4 A& H+ ?2 O; J4 v1 T$ D4 y) L* obutton = $04    ;单次按键! s1 g/ J. T- r4 @& o! v* i6 h9 g- ?
flag = $6000    ;功能开关标志
: q2 R& g7 n6 y$ Bpause = $000E   ;暂停地址- a' w! t* |4 b: {* `

) R1 d/ N8 ?/ m$ e5 z" p9 ` .ORG $8000# l, J/ |0 ^' e& g. `3 u4 H
LDY #$08    ;自带的按键程序
, }# Q7 N5 ^. o* G! E8 Z- zADDR8002:- e$ v, x! D# @
LDA $4016,X
3 O, J- A. L) w: e  G6 F& E LSR
' L+ U4 [) n% d; v' D1 L& g ROL $0021
; _3 B) d" w, a+ O LSR
* z) D1 {, K7 h% ^ ROL $00292 c7 b1 E# {9 A4 q3 `1 o
DEY
* ^- U$ p+ \) E8 C BNE $8002: l" W' y, C" p0 f& Z  y
LDA $0021
3 I6 Q, |) k% U9 Z2 X0 Y ORA $0029
! Z3 s, v5 n7 N. c STA $0021
9 ~9 ?, M+ t9 i2 b LDA $0020& _( F0 ~" K) D- J5 A
AND $00215 n) w" T0 P% r8 I+ b" b
STA $00203 z/ i1 F9 d" Q+ q  O0 u8 m8 L
LDA $06,X. B" B' M- j: b6 w# T% z9 x
EOR $0020, g2 i) \' @+ [( m' t* m" J' L; B
AND $0020
) ]1 i/ j# ^7 j* @! s7 q STA $04,X9 W5 A  s0 Q1 z$ \6 b1 D
LDA $00207 J9 o+ ]+ N3 t, R
STA $06,X
5 o0 Q3 Y2 G' d% Q, o JSR KEY_OPERATE
% [: S; I1 x2 v JSR Function    ;功能调用
' h5 I, Q; F) r0 y0 Y JSR Weapon    ;武器切换调用
3 C5 A, l* F8 w; I1 U# R JSR Power    ;威力调用
3 K/ _. P: B/ H/ Z+ p JSR BULLET_NUM    ;子弹数目
* |  X8 D, N3 e3 u* d! k JSR BULLET    ;副武器类型# w0 B7 k* S" J0 j3 z
RTS
7 T! }4 l" W9 y; C# n( L
5 @4 k% Z0 Y( V; ?$ r6 e; N : w7 t7 e& X* `
' B: [2 T4 L. {0 `! W* a, s" j
.ORG $8050
8 a( j4 D2 @- j: a. Z' `Function:    ;功能9 ^7 l3 A# M3 W: P2 @" T. k. X0 \
WUDI:    ;无敌( y* J& z( j+ M& k
LDA $6000,X3 l$ d0 u1 Z& ?
AND #$08    ;开关判断
1 @4 S( C3 K: t2 ] BEQ LIFE9 t8 p0 Z/ V1 d6 n  f9 l
LDA #$05
) K) g/ a' E3 k% r! |" ]2 V0 d STA $05DC,X    ;无敌锁定
3 u2 o& V3 [- lLIFE:    ;生命, u" z; g. H' Z1 x4 p9 N0 |) n2 u
LDA $6000,X* [1 r, @& m$ L6 W% \
AND #$04    ;开关判断6 x; N4 N: h' s
BEQ FUNRTS
% q# Z- }: x# H) H6 R LDA #$05/ w# y  \' g" u/ S' g0 K
STA $1C,X    ;生命赋值7 z2 X* P3 u8 `, z0 I; Z0 ?8 h0 T
FUNRTS:! u4 m8 O5 W7 I" q
RTS
8 Q3 a0 G! |9 L: _
7 b% @; J: [9 U) tWeapon:    ;武器切换
' I1 U2 ], K8 c- t2 |( i LDA pause    ;暂停状态判断1 g9 L& {% S+ K9 y& J" h
BNE WEARTS
1 {6 ~$ |% b8 S LDA $04,X
$ M# P- y0 v* ~0 j( w CMP #$20    ;选择键判断
! l/ U' o: @6 Z/ J! p) [ BNE WEARTS4 h+ [6 J) v- M( g5 T! v6 f
LDA $12,X! ^" v4 S# l% y4 P: h1 e- `
CMP #$03    ;武器值判断
: j# C  J: ^( m! j+ r% v" A BCC WEAINC
. D. L  Z% z/ E) \! }, M3 ? LDA #$FF+ {2 X9 r% d8 h5 b" v
STA $12,X    ;武器重置
6 V8 M9 ?  C0 _7 Z' ?& TWEAINC:
; R  A7 _2 e8 Z% `# A0 ` INC $12,X    ;武器增加; H3 F7 y/ i: e' b
( f  X/ @1 z3 ?, g
WEARTS:
5 M8 Y7 T' K" a) u RTS
  A" `9 b4 E; M7 H. z; l 4 C: v0 n# h+ B* q# a
Power:    ;威力- X8 T3 c  N9 e
LDA pause    ;暂停状态判断; p+ v# j9 q, D2 k3 F2 U
BEQ SPERTS
$ l( W/ \3 @/ o7 ?* CBUT_LEFT:+ V3 E6 L- ?9 Y# s' ]
LDA $04,X
+ @8 J# V) G, Y/ n CMP #$02    ;左按键判断. y% n) I; O8 U' O
BNE BUT_RIGHT
( @8 |. ?* L# g  m1 x LDA $88,X
" X, E$ u# ?) a1 H: w  ~* n CMP #$00    ;威力判断. j. h# E& W# n3 o7 ~" i
BEQ SPERTS  d% u! b9 N5 Q- M* `, x9 j
SPEDEC* Y* A! L1 n. t/ B# L( f* ?
LDA $88,X    ;读取武器值  x6 V- T1 x* C
SEC
6 Z! S# M+ M7 R7 T0 i5 Q" Q SBC #$08
% p+ G: Q! y/ _' l3 ]0 N9 y8 |1 D STA $88,X    ;威力减小
9 r. Z6 T5 ?3 Q! _BUT_RIGHT:
/ P/ s. C1 v$ I# b7 G! v LDA $04,X
* Q* V: ?9 E+ ~- w# ?* r8 p CMP #$01    ;右按键判断
9 F7 b+ ]/ k8 @5 N/ l/ Y: a BNE SPERTS
/ ^3 J. `: u! O LDA $88,X$ r7 Q) V6 r5 ~6 N# `
CMP #$10    ;威力判断
. N) b7 O6 c8 F9 {5 W$ |0 z5 ^ BEQ SPERTS: C) e8 }9 l* D6 ?, x5 \: A
SPEINC:6 n0 g" `2 H* U: k/ v0 ?( x
LDA $88,X    ;读取武器值
+ w1 }" r+ H4 h+ \/ ? CLC
6 ?3 m' P0 N$ g; t, G ADC #$08
, {) h6 ?: K3 U& G, ~ STA $88,X    ;威力增大
% x6 G2 K7 \& P, @- R* b
3 Z* K4 i; J3 k  K# l4 VSPERTS:
1 E) M$ r# A5 y RTS
  L# b( F) ]* x+ F. Q4 g' z1 [' f9 X) i& q8 M9 S* g
BULLET_NUM:    ;子弹数目* \" j8 e5 H& \3 T( i& ?$ E% g/ i& M
LDA pause    ;暂停状态判断2 |0 |/ I, ]$ e* M% [6 O1 u
BEQ BULRTS8 ?  f! R/ v& h
CPX #$00    ;主机玩家判断' c' q4 a. z" _- m
BNE BULRTS
* D6 }* |6 ?. ?7 Y! R LDA $04,X    ;主机玩家判断1 z" J0 t) n; v/ {  }+ U0 K
AND #$80    ;按键A比较- I( G8 Q, I# T  N* K+ ~$ L
BEQ BULRTS
4 w" i8 R; t& g( q$ V- y$ j LDA $87    ;状态判断
/ y- R( ^* l5 ?1 m5 ] BEQ BUL_23 o. Q$ C  c* [! E6 d  _
BUL_1:
3 `# t1 v5 c9 }0 p% J7 M  ] LDA #$00
' m2 l( G- s( V, D4 S STA $87    ;1发子弹
5 @7 v: X7 G* o) L+ {, M7 h BEQ BULRTS
! s' Q/ [7 z/ w# ~- R4 {8 |( ^) }BUL_2:/ j3 z3 U* }6 R: ~/ n% l5 D3 R1 P
LDA #$01
7 U, k* y$ u+ B3 S  J STA $87    ;2发子弹. M8 h) L& M. e7 b
" q. P( H' n5 F$ s* V
BULRTS:
& _: P& [/ D  Y( h& N6 F0 g- z4 O RTS
8 U5 a1 K" D" | - i9 S$ q; h4 {: F0 H; }

5 f* h; p0 `4 M& B) a, ?+ uBULLET:
. e3 N& `% J3 K9 J5 }' p$ u: [$ K LDA pause    ;判断暂停状态( I) w% c# r! N% @
BEQ BULLETRTS# j. G! H. Y: l" t0 Z
LDA $04,X, N, g! }  j& [& Y1 U! j
CMP #$40    ;按键B比较
; a% R9 k* D( `2 {* R# x) N BNE BULLETRTS2 V) z8 F  r! E; s& _8 ^
LDA $6002,X    ;读取副武器- B. R) z. n9 m- s$ j
CMP #$03
" `  q' W% s' J: b  `4 H: O# Y BCC BULLETADD' r1 X7 S! l! r
LDA #$FF. }' v% g! }2 }0 ?
STA $6002,X4 R) v5 t% L' H- V8 d
BULLETADD:
6 s# ^2 n0 D. I! I' t' \ INC $6002,X
& }& B: w8 r/ M; i
" D* A, k  f) W( y* qBULLETRTS:
( \) T/ V! C: S! f. m6 J* L5 ]7 ] LDA $6002,X
7 d- U* }' @) j; [ TAY
% O* V7 X) v3 H3 ?+ U3 v, B LDA BULLET_DATA,Y
! C$ Y" R  p" L+ e* N  ^2 s2 ^ STA $6004,X    ;写入副武器数据
7 s) v! a8 _, M" Q. n; V. [$ M6 z RTS8 \7 }, Y# z, P2 L" H8 C3 |# j& e

3 N; c& M& C4 b7 i* C
4 H& X% e+ q; G( {BULLET_DATA:
& V% I) v  v2 ?; Z9 s; X" I .BYTE $06,$02,$03,$04
; D) t  x: }! j4 d" s  I$ H
+ E$ z5 Z+ Q- `1 x( i8 p
* x) G' f9 ]7 {6 q5 V 8 G6 @5 E/ s: o7 N1 r& w% a3 t
KEY_OPERATE:    ;按键开关操作, P- G( Z, N- T8 m6 P5 |$ @
data_protect:    ;数据保护# g2 x' M6 ~$ u/ |0 ^! r
PHA
3 M# p9 c0 Z0 x/ ?( Z; ^ TXA+ H5 ?" q+ [. P
PHA
& k8 ^. ^2 L8 c% d! u TYA
+ L& o, F$ b, H! ^ PHA5 x9 I! Y; E" c. ]2 R1 ~

- C9 _( A  S' v4 Q% ~3 ?( \( H$ J$ {FLAG_INI:    ;开关标志初始化* N' Q+ S3 j6 X" s& M" ?

. M0 m7 _1 m2 B LDA $600F# N* A6 B+ K" @& m/ o
CMP #$01( H4 K; c- r' K9 {% [
BEQ pause_cmp- E$ X5 d/ [. X/ K7 I6 l( a, p
LDA #$00- I& R/ D9 |( p* N  X$ v
STA $6000
: M- y, L0 T3 f  y STA $6001
/ K, T$ O! l) G- W( { STA $60029 G% T, @" C: ]9 H& {+ _
STA $6003& D/ q" o3 \( P8 I2 C6 \8 @
STA $60041 q" O- {( z8 ]2 A, F; O7 M
STA $6005
; z* B: o+ q$ s8 |& \+ c/ c LDA #$01
8 {3 J# \/ ?" E$ Y2 w STA $600F. |+ B: p! D9 g/ o

5 b+ o# A# q" {' u2 s2 Bpause_cmp:    ;判断暂停状态
' t6 ]! A0 ^9 I" c1 U/ [ LDA pause  C, B) k" E1 ]( U% b
CMP #$01    ;判断暂停状态
) S: f8 X& p( l& ^ BEQ button_press$ j9 k0 P% n5 E
PLA- ~& }- d& C" D7 K4 {
TAY
6 }# W% Q% T% n  x' [- ?  E1 U% t PLA
- ?( A( b# z# G% F" ^ TAX+ H$ B7 K1 N2 k8 M
PLA& y6 m  z7 g1 D3 _9 N: A7 t- b
RTS5 G$ j  n# Z. e
( A( r6 s3 L0 t4 z6 A. q
button_press:    ;按压操作% U7 o: C4 R( p% Q6 |5 S
ini_Y:6 ?6 m+ B. I) {' r: \  A. B5 [6 n
LDY #$00, L0 U) {% Z5 I* ]5 n4 G( N
button_cmp:
2 x* t) l% _7 x9 Z LDA button,X
# w+ _# N. n4 D, u CMP ora_data,Y9 ]) P- }9 e9 b! S0 I5 e# y
BNE count_Y_cmp& F# I' i1 y2 k1 [
flag_cmp:
0 S  a9 x3 y7 U, ^( I* ~. D" z LDA flag,X% ~7 I2 D4 n2 W0 B
AND ora_data,Y+ g+ Q9 ^/ M" N9 s1 ?8 C
BNE flag_and$ I& e: y# }. J% G. j: @' f
flag_ora:5 F. T) r3 _0 I* \" F5 E- R
LDA flag,X
! R- a/ U- [4 \' e9 k4 x ORA ora_data,Y2 ?0 M& [( G  M1 ^2 M) L
STA flag,X
4 @0 L; m4 U  R% M BNE count_Y_cmp
' N  L  j3 U0 }# }7 A! i5 @% t9 Oflag_and:
1 D* m* {) y& }2 W# u. b% g( e LDA flag,X+ c- w) e( g( B" I" U
AND and_data,Y) D% j9 T3 g' m$ x( `5 P
STA flag,X! h) \% _  e! w* c+ x/ n& k
count_Y_cmp:7 J0 Z4 l$ k% K4 J
INY2 _# G0 X/ {! `& H9 E! M
CPY #$08. u, e7 j: b0 v
BCC button_cmp. v+ ^% ^/ S* }3 T
* e4 N6 h$ |; I% H
data_extract:    ;数据恢复
9 E5 ^1 Q  R4 A+ W' i& w5 c1 a PLA3 @+ n4 D- I! F# P+ ]" @# ^% w6 `
TAY
* o1 p7 t4 a% L9 c2 q PLA; O1 v4 ?2 z+ K. ?- j; Y& ?# ?
TAX
& ]. t5 G$ ]2 @+ c& [6 N& } PLA
: ^+ J. N2 K( E- ]- V# [# z0 q0 G . R. K6 G& K) F; E0 V2 r
return:- w4 ?4 o" n% v. _) |" A0 @
RTS
2 Y; ?! \# R& S: B- O5 Z 4 t! `7 V7 v' N& ^& Z
ora_data:   ;按键相或数据3 N- |& s' x$ u, z8 K5 a/ l  J( c8 Q
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
1 j% `/ @9 k) S" ^0 O" Land_data:   ;按键相与数据; z( b( j, s% Y: l
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF* k; Q9 ]: b7 O9 c! F; o

6 a, m' ?* a, C# P: k3 z
; Z3 @; x9 Y; ^- A* O) n" n   t0 \/ v; z! O2 c& o) {" ^, T. I4 Z
;FC数据搬移程序 BY FlameCyclone
8 {$ c% R: y( D, }$ s/ |: d .ORG $8200
$ G/ z& N: S; E; D/ f7 A2 U. d JMP DATA_COPY_PROTECT6 {; V; f' |+ ~$ K
9 @6 Z9 i+ Z! F. G& N9 q0 \
ADDR_DATA_TO = $40    ;目的地址
( P0 A, w/ T" i0 s. D& ?ADDR_FROM_START = $42    ;源开始地址
$ k  [% h. s  v! b3 n2 |ADDR_FROM_END = $44    ;源结束地址# W/ g- z1 G% u
8 h2 J9 S6 I& w  y% W8 D7 R
ADDR_TO:    ;目的地址" }# w; O$ ?. }7 R% b, t- z, h
.BYTE $00,$70
' S# o* J0 h/ p  _( T" ~ADDR_BEGIN:    ;源开始地址9 w. G9 d8 x6 c7 Z
.BYTE $00,$83, N% U( f, q- M  k; E1 _, v$ n
ADDR_END:    ;源结束地址, F: ]5 n9 }& E2 m
.BYTE $FE,$84
* W" n# b9 P% ~* X) Y( `( R3 N$ p& L$ a
INT_ADDR = $08    ;中断地址' b7 \" z6 z2 Q2 S! y2 W. c
FLAG_OVER = $71FF    ;完成标志
/ Z. y8 A; N4 u4 ?$ Y
7 e4 t" `) C- S- s$ L  b& d5 ~) B* E! r9 B' g  j
DATA_COPY_PROTECT:    ;保护数据
8 T) O1 Q6 S1 o6 U$ p& {  V3 B PHP
! S, P* g0 t/ T+ L PHA% h; @% D2 j+ v- Y8 f+ _
TXA
! o. A8 H$ |  l PHA4 q0 Q2 ]! A, q" x; k
TYA
. _% [& V) o5 W- c7 ~ PHA" x* u. c6 l& P5 ^- _
LDA ADDR_DATA_TO
& G. }  F: J) N2 X+ J7 B- C- _& E PHA
8 c$ ]' f' E& x" F6 Z LDA ADDR_DATA_TO+1
2 [& ]: y; q8 q3 P  Z2 O, r. Z PHA
9 t1 G* b1 U3 ^4 P- S, L LDA ADDR_FROM_START
. a7 b8 r1 w$ p/ i/ E# r7 ?- L PHA
3 _* a2 Q8 R* B5 V LDA ADDR_FROM_START+1
5 t( N  B$ u( k5 {& ~ PHA
& c0 E, @) }. g3 g; k LDA ADDR_FROM_END
6 n' c: ^/ U1 d! X PHA
3 i+ y+ }. b- N LDA ADDR_FROM_END+13 _/ l4 J6 w4 h( V
PHA$ P6 ]" C- J% }+ y' p, l6 G9 c

( J! D' H8 b8 ^OFF_INT:   ;屏蔽中断; `, `. V/ F) b0 I: u4 E0 N# A: s
LDA INT_ADDR
; e- O2 z2 Z# J1 F. e6 S AND #$7F
" ~+ F: w) U7 p/ ^ STA $2000    ;屏蔽中断  {3 ?3 a2 d) A# _) }8 F) G
, a5 @7 M- g5 W: u9 l8 R

  Z' q* y. K. d+ ]) ySET_DATA_ADDR_START:    ;设置复制起始地址, H9 l; i- N* B* ?2 o# u
LDA ADDR_BEGIN  T/ P& ^  A( G" U  j' B
STA ADDR_FROM_START    ;设置复制起始地址低位
  f# ^5 n. l9 z& \  |. a7 [ LDA ADDR_BEGIN+1
% Q$ m- x1 ^- Y2 n0 S' {, ~. C" r STA ADDR_FROM_START+1    ;设置复制起始地址高位. q3 h- B2 b# |4 p
% |$ S: f5 L. M; x$ \
SET_DATA_ADDR_END:    ;设置复制结束地址7 K: g* H# e1 n' j4 T% |, Y( W
LDA ADDR_END
' `& ]4 Y! i6 ^+ d8 F STA ADDR_FROM_END    ;设置复制结束地址低位
3 P" v! d+ V9 S6 ?9 f$ |1 g LDA ADDR_END+1% Q3 l' c% ?( W# _9 _0 G8 _$ P' j4 N
STA ADDR_FROM_END+1    ;设置复制结束地址高位! C+ G* S, z1 h
. W- a" u2 m" ~
SET_DATA_COPY_START:   ;设置目的起始地址; v" P0 K: N3 j$ {
LDA ADDR_TO$ u5 |, f$ z6 L( _( B' I% C
STA ADDR_DATA_TO   ;设置目的起始地址低位
+ g. v4 @' z! e9 C8 p: A* Y LDA ADDR_TO+14 o6 y& J6 e! o% S9 P
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
! ^+ @% b8 z% k- Y 0 v: M5 x: G; T) r+ ~5 V! c6 R) r9 @* C
OVER_COPY_CMP:    ;复制完成比较: O" J. Q% {" U
LDA FLAG_OVER
9 _; ~8 x; d: V$ K CMP #$FE    ;复制完成标志比较8 k$ m2 }& p) q" f4 S& s
BEQ DATA_COPY_EXACT
' `7 h2 c: j* i* v2 T) C3 }! o5 Z, E( r0 a/ Y; y
INI_XY_COUNT:   ;计数器初始化
+ L" ?5 ^* f" F; o  U0 k( b) A LDX #$00' l" _! y& r2 l
LDY #$00
$ M( l& i5 d& S2 \3 W2 A9 M) u. V
4 _% J5 k( [9 u* \COPY_OVER_CMP:    ;地址比较7 m8 f6 [( r( m* b/ @" c
LDA ADDR_FROM_START
& t7 v" X- r8 x" T6 e) v CMP ADDR_FROM_END
( O% q- R3 l! b BNE COPY_START
8 }" }1 O# V! P LDA ADDR_FROM_START+1
! h& k5 E2 p7 B9 _8 } CMP ADDR_FROM_END+1  w6 c2 A9 |% e" z% a
BEQ COPY_OVER
& w  q6 b- q8 J4 W3 u- N % E( H0 U+ r: i: z  g
COPY_START:    ;数据复制开始
4 D  }7 e5 p8 W% D& d LDA (ADDR_FROM_START),Y    ;读取源地址+ s7 \- ~! e, X5 e" s) S3 k7 ~' N9 d
STA (ADDR_DATA_TO),Y    ;写入目的地址9 ^. t+ k5 r1 Y. ?5 W
INC ADDR_FROM_START   ;源地址低位递增
! `( ?) h4 e) L  T+ ] INC ADDR_DATA_TO   ;目的地址低位递增9 N! i1 G% B: B7 s* u4 T
BNE COPY_JMP- z- _4 _% v7 [# w& V6 U, r
INC ADDR_FROM_START+1   ;源地址高位递增
/ D# q1 i; w" ]3 L  |; t$ Y) x$ ^ INC ADDR_DATA_TO+1   ;目的地址高位递增
7 C* Q% ]3 O- `( e
7 r5 l  R1 g8 q3 @COPY_JMP:    . E* T0 k/ o7 I: \
JMP COPY_OVER_CMP  E0 X& S7 I% ^9 ^* ]9 E) M. O/ w% u6 m
2 t* _6 Q! a9 `- l8 {, [. ]1 t
COPY_OVER:    ;复制完成
& c. D1 ^* j6 b/ u LDA #$FE
8 p) {5 z6 n+ b) i STA FLAG_OVER    ;写入完成标志
7 O" a7 c( O6 M, f" d3 t. [' q3 ZFINAL_BYTE:& U( c: l- T, h
LDA (ADDR_FROM_START),Y    ;读取最后一个字节
$ J, O4 s5 ]' D: J2 ]+ J; V STA (ADDR_DATA_TO),Y    ;写入最后一个字节
$ v* ^6 F) l, R4 Y
+ m. O3 h0 }" ]+ S7 c9 j8 WDATA_COPY_EXACT:    ;恢复数据& f9 x$ K4 M# n. R2 j8 X, o
LDA INT_ADDR
- t0 V2 \2 D+ v' ?5 B8 U1 { STA $2000    ;恢复中断
6 c5 m0 ^) c9 S PLA, }3 h) Q- ?  k& \
STA ADDR_FROM_END+1% O9 A, [& [: L) v. b9 u! C- `
PLA# P# R. J% q& c# i
STA ADDR_FROM_END5 Q0 W7 H6 a9 i. g
PLA
: j, ^, ^. i: f) B4 A: C+ X6 m STA ADDR_FROM_START+1
3 q$ V, v3 G$ p PLA
* l, Y  r& j8 K" Z' ? STA ADDR_FROM_START
& O- h  h! P7 p PLA4 g: S. h8 g- Q7 I
STA ADDR_DATA_TO+15 j) h  V: W- t6 B4 g5 T
PLA9 c% }& S1 J, [, I6 ?" Q
STA ADDR_DATA_TO
, {% A) M' c( k" o3 b) N7 @ PLA% {8 Q* k3 z; |
TAY; J8 Y& W# V1 H5 {: _7 b& ?; F) g1 N+ j9 Q$ F
PLA5 W2 d, L  T, K6 X$ W, J6 q8 q# k
TAX
/ p* z! U3 ^' z! y1 |+ ?3 r PLA
- |- ?2 g2 Y) ` PLP" `% i6 [- ^8 O9 K

* v0 @7 l- h8 }2 E( K8 X - b9 H  b5 d7 q6 F, u+ F* C, t2 X# k
5 c2 P; B1 w6 H4 u, g, _1 O
DATA_COPY_RETURN:$ a# {2 ]3 I" _' B2 z: w5 R
RTS3 Z( F/ z1 l& M3 e9 o
0 m/ U" V1 _( ]$ @  R3 @" b6 k( \" i
.ORG $C056    ;精灵指令覆盖
2 o9 ]& a3 D* A JSR $FFB5
1 W1 ~, b0 g% Q. v+ J! }5 h
6 E% j6 q: m8 G# _/ o" j$ n6 ?8 R .ORG $FFB5    ;
) F9 `6 a, w, s! v7 @! d) k( x PHA. }% Q5 \, R* n% @3 c7 F
  TXA# u% a( G4 ]+ \2 c
PHA0 M& b( r  Y. C& g: t- g) K
TYA
* m3 ^, @. L  }$ I% O PHA
3 }, B1 i5 E+ h+ ]- R, M3 i5 {" F LDA $71FF    ;比较7000-71FE数据是否完成复制
2 a" w  Z" B/ w6 F& I9 C+ \& z; [ CMP #$FE& ?2 J9 K6 I+ b+ ]0 c
BNE ADDR_FFCA- e! p5 `) d1 S9 l8 M1 B
PLA  [: b6 D& ^4 U8 i' ^$ Q; ~
TAY
) i( G9 ?/ L" u  ^1 t PLA
; T# E: T* `/ r' u% s2 I TAX
' |& Z- n2 d0 G9 u, i2 I; X PLA7 x! g: c$ c+ O% n, X$ s# C
JSR $7000   ;跳转到自写程序* q, f7 f& _& u: n9 J4 `
RTS
# C, ]4 H/ S# |! ~5 iADDR_FFCA:
9 ^; W0 ~( u2 L0 f& m PLA
& |) m2 {+ T4 W3 Y* y( [ TAY7 u- }" _6 n$ ~9 W' Y9 `, A
PLA( h+ \: q. J4 D5 h
TAX
5 X$ T1 F, G' v* \% Y- H PLA
0 r2 h  V$ v6 }7 r2 l& [ RTS- a% n* B7 v. Q; C% g# T7 \
7 H& R' y+ H' r* F" n5 W

* s6 N) O( p  W( \2 X* d, r
+ h7 K, _: t( U7 z9 Z8 U .ORG $C264    ;自定义的MAPPER2切页程序$ g, F) c! B2 M: [& _4 E  Q
PHA3 E% R& D. u5 Y$ O
TXA
: W6 v# Z5 K) J* w# z0 U PHA9 I9 j: ?8 P" x5 a
LDA $0066
2 g8 d: v! }9 ~9 i2 ] BNE ADDRC280
' N; P$ j* n! s$ ]: K8 F; k LDA #$07  ^" N0 x$ @5 D2 y6 C( r; @
LDX #$03
0 W& h$ y- o! P. F JSR $CD9B    ;自带的切bank方法
; `; c+ K  G! w* t: v PLA+ d/ l& o& h1 g  Y4 o
TAX
% a) T1 \, \4 i3 M. ]6 `/ j PLA0 r$ T* d! \4 F; P' }& j( C# z! s
JSR $8000; I5 ~% }: P/ F
LDA #$06$ D' a, ]6 f# G) b. R. F
LDX #$03
0 ?  f/ O5 Q. j, p, V( O* m9 I JSR $CD9B    ;切回原该切得bank(可以不用): {+ A7 W# f8 Z' u7 _4 F& j$ r
RTS8 J7 Z0 \1 B6 }
ADDRC280:! w2 p& F, J( t9 e# B
PLA
' ~: f" ~: P  {  P" m* u! h* G TAX, T! g* j) A  H9 e
PLA# J1 V* m$ Q( c/ P7 @1 |0 r5 Q
RTS5 D# d/ ]- L) S- ^- {& x  i- d
: r+ \/ |3 _8 S8 ^7 a6 H
4 K+ ^/ m0 t9 [, F/ v7 u
;[FC][最终任务PPU][END]
' x6 E! y2 ?1 _) b .ORG $C056    ;跳转到PPU重写程序
" ^! Y4 ]- _/ y2 R- H JSR $7000
* D+ v( o: R* Y2 ^, j
2 w' X3 G8 F, y6 N  ^8 h8 ~ .ORG $CEBF" D- x. s5 q6 O6 a9 v: |
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入. ?6 ~7 g9 J9 d& m4 R/ ]' d# v
  4 g$ k( v% n4 K; w+ r: l4 b
  .ORG $E4609 M* c$ K, s* O/ U- [9 i
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入' H9 [& E& \/ Z8 u
  ' S4 @: S. S1 @/ H* y, N
.ORG $71F0* N; ?6 S5 \% }$ w, C1 u9 b2 V
STAGE_DATA_WRITE:( Z8 [, V8 n4 ]1 l1 L; x
  LDA $6010( e* d. L. k* R2 }& [( g8 L" D
  STA $1E    ;关卡写入
4 Z# y2 u0 X5 v  q" {  LDA #$00
8 {; Y- a) O7 `9 D  RTS
2 [: f6 n! X9 @1 D .ORG $71C02 |- d5 S0 A4 J- v# {
BULLET_DATA_WRITE:    ;副武器数据写入- d9 v; j9 {1 K% _5 N" j
CPX #$0E
: B* Q, Q! J% Z+ K- A% {6 a BCS P2_BUL
$ W- m; n) q0 H, n6 c  n& m/ ~P1_BUL:
7 w% P" I" N* Y' K& k9 a  X/ T LDA $6004
1 l! b$ O2 y# h+ X1 v JSR $D7D0    ;P1副武器数据写入" f3 Y( y/ Y1 \9 p; K6 P( z
RTS8 a0 e  Z2 _6 \* ^8 g
P2_BUL:
, ^1 m5 Q2 E' x LDA $6005, i: S: q0 y1 e9 m/ O0 ]) ~* |5 U
JSR $D7D0    ;P2副武器数据写入6 J2 H: [: D, T+ n& y- L
RTS8 M( \$ m" |4 o
+ o% C0 Y' l$ s# u' ]0 [) H+ I
3 D( k; {9 y4 n0 y
.ORG $7000
" }' \9 A# m1 e7 e' V/ I) }  
% o5 X/ e0 ?: ]- a0 K8 L STY $4014    ;补上覆盖的精灵写入指令( h  @" l- c+ S9 q* O
PHA
9 l! d9 Q/ H& p0 Y7 W TXA% Z! {% J* M+ c
PHA9 I6 Y) u9 P; n6 ~" n7 ~( @
TYA
+ x7 B, F7 Y; e. {$ z, P PHA
( N2 h+ V6 Y6 B( e6 y LDA $0C
2 E" T3 p& f* B. Z8 d9 `# r CMP #$01    ;比较是否为标题画面) m+ O, C9 C* \) ]$ O3 v
BEQ PPU_STAGE$ |/ @: z" x. ?% _8 a/ B& C$ P" Q
PLA$ j! t, e  D/ B
TAY2 m4 b6 Z$ k7 g; Z7 d! Z
PLA$ m1 n: R6 c( b$ `; u9 R
TAX8 {& ~1 T2 A9 m+ W5 r
PLA2 W# @1 y: z8 T1 m- [5 u
RTS
8 h, p5 W% u$ G, j% U6 dPPU_STAGE:    ;STAGE显示程序5 O# I7 E- ]# H& o
LDA PPU_ADDR_DATA
- L+ q/ s& u, {5 J6 r- F0 s; G9 k STA $2006* P3 F- |5 b) q! v) k+ l  i" e8 r
LDA PPU_ADDR_DATA+13 O7 D6 k6 x/ F: [4 V0 \6 ]
STA $2006    ;坐标设置
  L7 f- o9 b) y5 z: ] LDX #$00. M/ e& _! {: K
PPU_STAGE_WROTE:    ;写入STAGE字模# m  x4 u- U6 P( |
LDA STAGE_DATA,X6 @7 h; X$ A2 ?) ~7 H# k$ l
STA $20070 ]) X6 u* z! I  O: y: h
INX
2 ]3 `: o0 @( a, P" { CPX #$06
5 u: {) ?. T8 ?# B BCC PPU_STAGE_WROTE
( \) a  y6 G  U1 c' k2 K4 j9 G! |4 h LDA $6010
: j) R$ n+ O' B. w, p* \; C, ~: Q* U! L CMP #$FF    ;关卡数据初始化条件判断8 m- q/ k4 z$ d3 G, \4 y" l
BNE KEY_B
7 p% W' n# p7 y8 X4 H LDA #$004 `% g6 Y# P+ J# D2 n' d$ I
STA $6010    ;关卡数据初始化- L, ]' x* ]2 H
KEY_B:    ;关卡减少! @" F' Y0 q! T/ J8 H
LDA $04
( _# d0 q% l& {) F' f; s" C AND #$42    ;按键B或左减关2 F  w. M# B% N$ l: p' q$ L
BEQ KEY_A
/ c4 E' J* \" Q LDA $6010
- Q( D1 s3 j. g CMP #$00    ;关卡比较7 m+ r) \- U+ y1 l5 Z
BEQ KEY_A$ Q7 \: g- X* M4 v# z% {& F9 Z1 i
DEC $6010   ;减关
- D( N; J& x/ K" \4 [; \KEY_A:    ;关卡增加
5 I* ^; Y7 a/ t; [, V  g LDA $04  O/ `( a0 \; U# j
AND #$81    ;按键A或右加关
: |) z6 \% g! G' W BEQ PPU_NUM_WRITE2 r2 G8 W7 A( W
LDA $6010% H+ P( M' j2 h6 \
CMP #$04    ;关卡比较
$ x9 z/ Y6 y# n8 H6 @3 a9 B  V BEQ PPU_NUM_WRITE
/ |* u  [# r$ i- @5 v INC $6010    ;加关
8 @* H2 j7 ?, C$ |PPU_NUM_WRITE:
. ]3 s; E. }  C& _0 J LDA $60108 W2 ]4 \" l+ q) e0 H
TAX: m1 K2 ^/ z; o7 h- }
LDA STAGE_NUM,X    ;写入数字
, s3 c& T- Q; @0 r2 ?" \, Y  { STA $2007
/ e) W' M: F3 w9 u& S1 rPPU_RTS:
- }  h% U3 b! o PLA% y  q% l. @( p* B- k5 d% g
TAY
/ V; C$ u5 d8 U$ Y5 w* Y5 O, | PLA
" [4 Y! z  u4 z TAX8 Q3 B* I( J. Z0 M. k6 m( O  r6 c% k. ]
PLA2 f0 {3 u/ D1 L0 K0 w: [' q8 Y
RTS
' i: d# c! k: `6 p . F* a7 ?( e6 y* ]6 }  d9 p

7 t) y1 m# X( `7 G* G4 e$ eSTAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据5 T- Q; i' F; v/ D
.BYTE $EC,$ED,$DA,$E0,$DE,00
! w5 ~- Y* [& cSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
6 J: ]. R2 r6 C3 |9 J; ~ .BYTE $D1,$D2,$D3,$D4,$D5
1 B( T( t  d9 E* Y% e9 h& |2 m 1 a' n+ ^! D6 }9 [1 {
PPU_ADDR_DATA:% t6 r$ O+ ^9 N9 d; S
.BYTE $23,$0C& g! l# P& l; V/ K0 r' W5 {

# ^9 m( Y) H5 f

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2025-2-19 06:37 , Processed in 1.079102 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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