EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 1 q1 s7 W, h4 [7 Q8 ]6 R' ?. V( K7 w
% ]' x' M7 S" O4 L. F5 }' Q
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.; H$ q1 A6 Z" Q
然而,今天想到一个思路./ u5 E2 X! i1 U0 K' F# T9 p
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.; S! J2 z. u6 |* b
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE+ n7 W( r' P) |* Y
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
/ ]% r5 [* W% C
, Q+ S; L5 a- J1 p& ^  R. c$ ~  L1 I( o4 `( m$ X
;[FC][最终任务KEY][END]# t8 _. C2 o( t3 I# X- d' p  E8 T& o
button = $04    ;单次按键1 J$ d& R5 C% W# t/ Y+ w- N' O
flag = $6000    ;功能开关标志5 B7 S. {% P: _  s9 o" W5 N% n6 T
pause = $000E   ;暂停地址5 C6 A% N+ x/ [& L! U/ \
% m2 t' h& `3 E1 h* c
.ORG $8000+ u: A0 c' ]0 ?1 T9 c$ y
LDY #$08    ;自带的按键程序* ?! Z) P$ O1 Q) E6 C
ADDR8002:
( c6 a8 J  w4 U5 i! \- w& h LDA $4016,X4 I: r- U; O6 |+ P5 Q0 m' V! S
LSR- @. w4 G# R1 `* G
ROL $0021* U6 _" g  D' L4 `& {
LSR
' g+ M1 X( X* t& H/ U+ S* m  y* E ROL $0029
# k8 T! A- Z& [  a. S& N9 E DEY
) c% o& d' l9 |5 P7 Z1 j% l BNE $8002/ W! t( \9 [& T" h9 c
LDA $00214 R" v7 C0 ^! s; ^; F' `# L
ORA $0029
  R3 b' J% e# n+ F" u! u STA $00219 a0 V5 K0 R& ?$ c7 _; W$ o  `
LDA $0020
5 G* k4 K  }  Q2 y$ O* y. V* O AND $0021
8 w( z& o. C* P& i/ m" R STA $00206 r5 q! W# ?+ F+ Z1 _
LDA $06,X% w$ P7 e! y$ u& _( w3 Z: n5 J3 V
EOR $0020
; I, ^9 C* y7 G AND $0020
, n$ P) s) y% `( Y* ~ STA $04,X3 V0 U. {: f* W
LDA $0020+ u# L5 b, @6 \& |9 v
STA $06,X5 C# s4 c+ M* E
JSR KEY_OPERATE# P' E: w& _" I* e4 ^
JSR Function    ;功能调用6 n) F* d+ _- _& W
JSR Weapon    ;武器切换调用
6 n1 K; n! z/ B- j5 q JSR Power    ;威力调用
! V4 C# V! g5 C4 r0 s6 T JSR BULLET_NUM    ;子弹数目- {# ~7 B: Y0 z$ |) b& ~& k+ n/ d
JSR BULLET    ;副武器类型
1 P2 k) L# j9 |  f& }5 l) L RTS
0 n" T$ T0 g  _ % x3 q( l! N( a: T! t1 Z7 m" P! _
5 Z. u, d/ F" Y! v5 ~; P
/ T) F, F* [3 d1 Q' \6 u
.ORG $8050
4 L3 m4 }# W( }( D+ _1 g" RFunction:    ;功能
9 s3 H- i( n6 S8 WWUDI:    ;无敌
& }% b) L8 T2 R. w8 o  W LDA $6000,X
4 ^1 p; e4 j! ~ AND #$08    ;开关判断
3 Q/ ]$ Y  u; N! F. X# U( r) @ BEQ LIFE+ h4 \/ z6 d% \0 j
LDA #$05
6 j- e6 j" T6 J/ @ STA $05DC,X    ;无敌锁定
4 d' W# h/ `; j0 lLIFE:    ;生命
3 @6 }' S4 U/ D. r LDA $6000,X& t; ?9 G. I0 L) N8 V5 E2 f; k5 p
AND #$04    ;开关判断+ J1 B* T+ E2 \. f
BEQ FUNRTS
( i! C- z9 [  Q* S LDA #$05
# X) C* x% G( _$ J0 H STA $1C,X    ;生命赋值1 F1 X8 I- Y8 R
FUNRTS:
( K! G7 o5 ^4 ]4 ?' m5 p8 r6 Y RTS, u  t, k0 Y# ?- d% Z7 o; ]" @

1 Y  r, B0 k! w/ w, SWeapon:    ;武器切换
/ m4 p: {, S7 |+ ]1 l LDA pause    ;暂停状态判断
! \  m  s$ [9 |2 V BNE WEARTS
; J- p; u' A, q" }  C( u LDA $04,X' p) }- V7 e: C8 _) q
CMP #$20    ;选择键判断+ ]/ ~2 N2 a1 z- m8 i. J
BNE WEARTS9 B  B) O9 C9 O$ k( K& K
LDA $12,X
# O0 D' a% [4 V! _ CMP #$03    ;武器值判断
* m, N3 J8 q6 J- S" u BCC WEAINC" l. G1 F8 z9 t0 Z9 A
LDA #$FF
- v: l  ^  |, w  q$ }: @4 J STA $12,X    ;武器重置
2 o. w) Y$ H! D- Z6 q# P* _WEAINC:2 n* t7 D8 H- A% T! `
INC $12,X    ;武器增加# ]& i$ x4 ]8 K* F6 P; ^5 i! y
3 ]( e6 I, T$ g9 d
WEARTS:6 D  y1 @4 D; H1 L
RTS
9 F7 X6 D: [3 F$ n 8 S0 d+ m! f* r' M! T6 @* v9 V
Power:    ;威力
; d9 B) h, ]" P" B LDA pause    ;暂停状态判断6 u" w* c1 b1 P. \
BEQ SPERTS0 @0 j* t0 e8 ]
BUT_LEFT:
: C0 S- r! p/ w2 r. N' X, b LDA $04,X
7 R2 V" A' v' Y/ n CMP #$02    ;左按键判断7 x* d6 l* n& k  Z3 R
BNE BUT_RIGHT
( D! x8 [( }& j* ]. T: H LDA $88,X
0 g4 G0 M( F0 I; k$ h CMP #$00    ;威力判断( v( m- b6 b& Q5 ~4 G
BEQ SPERTS
3 n7 h* Z: {  YSPEDEC
. F9 r: J# b/ w+ g( \- t LDA $88,X    ;读取武器值/ R, {) t2 I; k1 E
SEC
# L+ _3 L/ l- X& b6 C5 G6 }5 U3 y0 g SBC #$08/ t4 D( k( E% w& R6 ?
STA $88,X    ;威力减小( W0 i+ J2 [7 s$ q% t
BUT_RIGHT:
2 ?  U  \! ]; S  M LDA $04,X
3 k0 J% i$ M# g' r: U; o CMP #$01    ;右按键判断
" d0 Y9 Y7 \; H, G+ V2 g( t BNE SPERTS+ M% `1 Q$ p0 O1 ]
LDA $88,X6 w- |- g; m" i1 N: i2 n1 X; o
CMP #$10    ;威力判断
1 p6 B" h6 I9 a BEQ SPERTS
0 X. B$ i+ d- tSPEINC:
9 X1 p2 C& J, i LDA $88,X    ;读取武器值# O$ Z8 O8 ]$ L" y% d" w1 z( i! M
CLC9 q& ^; F: h9 S: U. L  G
ADC #$08* m) K9 U% ]& g: U! ~  f5 J
STA $88,X    ;威力增大5 \3 k9 R3 M. y1 \) U: _7 U" |8 w$ I
3 }) S/ A# }- i. R5 k+ U  n
SPERTS:; n! j  X$ e1 U, u1 ?$ M+ e
RTS
. Q' n' e% m0 k, Q1 m  `
; D3 G4 s2 V( l+ @3 \$ g  Z2 ^7 {" \; zBULLET_NUM:    ;子弹数目
  l* h4 R5 a; x% s  E0 ~" c9 x1 ` LDA pause    ;暂停状态判断* W+ y- G& @' `7 M+ U1 ], m% R
BEQ BULRTS
$ \$ h; y4 M( q6 u" v+ } CPX #$00    ;主机玩家判断
% ^  t4 D" }# {( C6 L+ f" m BNE BULRTS
. o9 k* n' e- U8 K9 K# [ LDA $04,X    ;主机玩家判断
! s! x6 S# K! J. B AND #$80    ;按键A比较
9 W0 A; N- K, }3 U7 I* {" A+ n$ U BEQ BULRTS
0 W* ]5 [' L' S. ?( J LDA $87    ;状态判断
' f* O) n7 i6 A; m BEQ BUL_20 @% S3 x4 h* W
BUL_1:" [5 r: C3 q5 B6 C: x
LDA #$00' h( S3 p3 @8 @/ E; C
STA $87    ;1发子弹" n+ i. l$ F) S1 D6 q( h
BEQ BULRTS9 U5 U1 J0 I9 N& v+ X9 K
BUL_2:. w. \1 Y+ G2 o( [( Y
LDA #$015 \8 [" f8 d" C) y! y
STA $87    ;2发子弹
1 F1 e( u" ^( m; A' k! r / W2 ~0 _9 T. j# l' e  ?! x
BULRTS:
* Q# J) x6 X# e" X$ N, a RTS
, o- [* C; i- a" ^# h7 n( ^ / b1 }) n' ?4 z: v- N: f2 A

# k7 t: U& `$ |2 r& Y% UBULLET:
# P2 b/ C: }6 ]- V/ F/ D LDA pause    ;判断暂停状态- Z4 F% v0 G5 c, W/ \) Z" L8 u9 r
BEQ BULLETRTS% C+ ~5 P0 u3 k$ p5 L2 l6 O3 _
LDA $04,X
5 n- ~7 k( @/ c. [2 y CMP #$40    ;按键B比较
" }# [# Z9 P9 P8 N) D BNE BULLETRTS
  v* x/ k' L8 n* c! I# i* i LDA $6002,X    ;读取副武器
5 \5 S) O1 D9 q+ P CMP #$03; r3 U" ^# {4 ~7 X+ ]5 e
BCC BULLETADD
0 K9 k. R9 W/ L6 I: m& O5 C# s LDA #$FF* x0 P% f% K9 }. Z# G
STA $6002,X% D: O2 x6 U( k! R% v
BULLETADD:% T6 D6 x4 d+ f; y( @! ~) V( K* }
INC $6002,X
$ N: e$ c" m: W" _
5 r4 Q* e" \4 H0 f9 K9 ]% a2 `BULLETRTS:
2 R$ P4 k5 G  Q2 h$ D LDA $6002,X2 ?, W; j; n) w) L1 Y
TAY  P" f# D2 X: l
LDA BULLET_DATA,Y+ ^) ~* p3 h4 ]$ P7 N% e. P
STA $6004,X    ;写入副武器数据
9 D; M! W; r, ?# {1 z/ E1 _ RTS8 [& i4 R4 A2 t2 E9 U8 t2 w

& s/ ?& _- N0 |+ x- o  D7 H * N8 t0 d7 J9 K4 P% z8 Q5 p: r, A
BULLET_DATA:  h; i& j6 P/ I8 B
.BYTE $06,$02,$03,$04
6 x* m$ V6 Y4 G! E9 q+ x 8 U  g' B+ j$ R& P7 B% y

' n$ \& k( X7 O. Z# q ' p" I* K( _0 k# y
KEY_OPERATE:    ;按键开关操作& L. H: d0 ~4 D0 ]9 b( a. {4 h
data_protect:    ;数据保护
" C/ F% O" ^5 k PHA8 T8 Y0 C- L$ v6 F7 a
TXA
5 Q7 A4 S; S" q PHA
7 J0 [7 n& h; M6 H TYA& |  g; w  _- J- ~7 x9 ]" H
PHA( T2 B: z0 T5 f3 W0 D
2 {6 o. \  u5 h$ t( c4 d
FLAG_INI:    ;开关标志初始化/ h/ u8 ?3 Q' X) W0 |# M
) Y! a. n$ `( o# Z
LDA $600F
6 [8 V# j% C* m6 U- S CMP #$01
2 V% u* m: p7 r) {0 m8 Y BEQ pause_cmp! o- S+ _4 A9 f5 T: r* y' d  S
LDA #$00& ~9 J- F9 ]6 p- d
STA $60008 W4 b2 G* v' R8 c' X1 q
STA $6001- [% a9 Z) V& x3 _, h, v
STA $6002- A" m. C. [% {' t$ N$ U6 ^
STA $6003: j, K" l+ U! S6 j
STA $6004
+ R0 c: x9 L6 R& Z) J3 ?% @5 B STA $60052 i3 ~" D+ a$ M! {* W: |9 I- r
LDA #$01. V5 z! s* o0 }, x$ C$ g* P
STA $600F# C# S3 T: f8 b7 H- t! ^# X

0 b0 t% d* P, l0 mpause_cmp:    ;判断暂停状态% p+ J- G5 S; p$ C
LDA pause
' u. K; ?( S5 n( J2 t: i CMP #$01    ;判断暂停状态/ j6 ]- D* W4 n+ i! M1 s
BEQ button_press
+ C" K& q9 G& v% G. h; F PLA
# h0 l& s6 F2 P- @! w TAY
9 V/ e* J6 x0 H2 X" y) @( r PLA" [; v( v! Q' j2 V/ Q9 k
TAX0 z8 L: V0 K% s
PLA, \$ @9 G$ z5 g: ]
RTS' B$ w6 i" j; p+ @& {
  r( {8 h* O) g5 }* Z, I2 W
button_press:    ;按压操作) k: r, R! z* [$ F; }
ini_Y:
& o3 z& r0 ~8 ?4 |* d LDY #$00
" f2 x' u3 u/ _) jbutton_cmp:
" J9 p) ]" @6 h LDA button,X
3 H/ x  z4 t+ A! ~ CMP ora_data,Y: E  I% G' R7 ~, m6 z
BNE count_Y_cmp
7 R" ~. I- H7 N4 v4 h# jflag_cmp:
3 H& I4 F, K' {% ]( W; { LDA flag,X$ Y" w( ~2 x, e; o/ K& W4 j% e! i
AND ora_data,Y
7 X2 J5 Y) A1 Z5 i BNE flag_and
; ?7 X, D  u. [  @flag_ora:9 i$ f  x! k5 L  j9 @
LDA flag,X
! k* j* J4 Y2 e% S; W! q1 N ORA ora_data,Y: Q2 S4 o# d9 d1 M/ @7 O4 i3 N
STA flag,X9 Q" X1 p0 Y# f$ w4 `. _
BNE count_Y_cmp
4 X$ }% E, s9 r# xflag_and:
! a) ]2 i, e( L% ]4 E. U2 ~- @) f LDA flag,X- x3 R0 i! ?% n% n8 S
AND and_data,Y
9 m* }, S+ H# }4 D5 {' m4 ]3 x STA flag,X
7 V' g& P7 k; O2 [6 P( `/ [count_Y_cmp:& J5 d2 V6 q: v- g
INY& N9 X. x' `+ E7 Z1 H' o6 s5 x0 A
CPY #$08
! L& B9 H- ~; v- u) e BCC button_cmp8 o, B; }% k" Y- E" M% ]6 u! ~7 M

) W" ?4 b. z4 {# z+ }. z5 vdata_extract:    ;数据恢复1 _% c' e# x: [  t
PLA
: c& O; o4 {& }7 H' o2 ?. C TAY0 D- b; \! ?) P1 Q) r5 U8 Q4 s2 X
PLA
3 r. R% w$ I/ Y  @9 t1 w7 @0 c TAX% D" {; n% S+ h6 ]& o. d! X
PLA
  _+ }; d; t9 f# T% ~% C / E9 p9 J- ^: {% ^5 R
return:7 b; ^; [" w9 d& T/ }' Q* u
RTS* r; U# a: L5 H

- @% p+ i: e" v; G1 ^& Sora_data:   ;按键相或数据) s6 m8 m8 j& L! \( l
.BYTE $08,$04,$02,$01,$80,$40,$20,$10) x+ M" n) D% U
and_data:   ;按键相与数据/ g1 U+ X/ X0 Y* x; H, t8 K
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
9 i' ^; u% G1 u, K7 { / y/ T$ Q" C  l8 |

5 A0 `7 w* k5 }- M$ `. K
7 f( k6 Q* ]1 x: Y1 ?; I6 l, n3 Y ;FC数据搬移程序 BY FlameCyclone
4 S, x& s. ^" t. O& B( c4 N .ORG $8200
4 t. A2 ]5 H6 j1 D- B JMP DATA_COPY_PROTECT
9 X5 r% y0 i+ V
7 g  Y+ w. ?5 S# gADDR_DATA_TO = $40    ;目的地址! K5 L2 ?. t! x, T- }: Z& w! E# c+ T
ADDR_FROM_START = $42    ;源开始地址: H. \% m  v1 B. {' i+ M
ADDR_FROM_END = $44    ;源结束地址
, W  X' j7 \$ O0 L- X* i. |( i
; L4 }9 f$ ?7 x& x8 h) r/ qADDR_TO:    ;目的地址
& c9 _" v! }* [3 y* S& @3 U .BYTE $00,$70
5 d) @) @/ u; k3 ?% TADDR_BEGIN:    ;源开始地址
) p% G$ k" b5 K7 @2 \* {8 e8 X .BYTE $00,$83- |5 H  ?( {, P  w7 t- a
ADDR_END:    ;源结束地址
! J8 s5 @- w+ S! w+ B .BYTE $FE,$84
& I- E: g% @; S! @; y. ~! W
7 I  d, N; i$ B- p- J. F' w% I3 j* Q# f4 gINT_ADDR = $08    ;中断地址
3 N+ X3 o5 M2 d# b3 s1 X# bFLAG_OVER = $71FF    ;完成标志
/ ?) |6 R: U3 k: B" t4 m' a
* c( q0 l; {( V$ D% v- `9 k+ L' i' r8 W- L  u1 i- I+ v
DATA_COPY_PROTECT:    ;保护数据) w- [: q6 M' h" l  P! N; p
PHP8 J! H" k% w6 N8 L+ q$ x. `
PHA$ h4 _! N+ V* C0 I% Q7 D" @
TXA9 @9 G7 W, T! s
PHA
. F' V  w6 D  h* s! h TYA6 r  s  N2 c" s# R
PHA
4 W1 ]- f! q7 p- a' d; i, D' R; q4 D% d LDA ADDR_DATA_TO7 U2 g2 w% O; v; }6 D) D7 v
PHA
1 O- f& p' l& A/ A% P, \9 \ LDA ADDR_DATA_TO+1! O! Q) H6 J( V. |& `2 \' l
PHA
# ?. V1 o" d; Q" @ LDA ADDR_FROM_START% Z. r# {' L8 B) x2 C7 g
PHA9 m/ O' L& w! w1 A+ I) |5 |
LDA ADDR_FROM_START+1
3 z4 Z' F' j8 p3 E5 G% U PHA! o3 o% I) X% c2 D
LDA ADDR_FROM_END2 r" p/ k6 |# P  C' c+ B; x
PHA' Z- G& l1 x0 [8 I6 K
LDA ADDR_FROM_END+1
4 z& ?/ I9 m5 C0 L8 g PHA
$ G9 I0 @; V; D7 C9 j) [- x% G
2 X' ^) s, o  k$ d: }OFF_INT:   ;屏蔽中断
" n+ }! U$ b- f2 P) R9 ]0 x0 X. |5 W LDA INT_ADDR
. Q. [1 {* B: \1 T* j) S* Z, n8 h AND #$7F; l! p5 x1 S  {  c! D& m8 H
STA $2000    ;屏蔽中断: E8 E" U3 w: h6 r4 p4 T

$ D# i+ j+ f8 O, s# J' k
; e- |, f  P' H; e1 h, G4 B4 ]0 K) }3 SSET_DATA_ADDR_START:    ;设置复制起始地址
" K7 C1 s0 n1 I! H LDA ADDR_BEGIN
3 N2 E& L2 l# L- O% p STA ADDR_FROM_START    ;设置复制起始地址低位* G8 b2 b* o3 E. D5 G% Z8 ]
LDA ADDR_BEGIN+1
3 G3 q5 ?: K1 A; v; `5 B STA ADDR_FROM_START+1    ;设置复制起始地址高位
3 j7 S& f, U* b1 s * {2 s" w6 [* G, c+ G
SET_DATA_ADDR_END:    ;设置复制结束地址
1 i) i% {- a, Y" x! L' k4 ~ LDA ADDR_END
% T4 |$ \" q' @& d4 @ STA ADDR_FROM_END    ;设置复制结束地址低位" ]0 o9 |# Q2 j) l# r
LDA ADDR_END+14 e* n8 B% O; F9 ~. t
STA ADDR_FROM_END+1    ;设置复制结束地址高位( @; e* b8 w% H
) _5 P8 B" a; ?$ M8 f/ Q2 t
SET_DATA_COPY_START:   ;设置目的起始地址
7 N3 [- R9 @$ Q2 `$ B2 H9 N LDA ADDR_TO
$ p4 m- Z0 p) Y9 q. y% N4 q STA ADDR_DATA_TO   ;设置目的起始地址低位
) z+ K9 M% d5 H9 U/ c4 O& l1 j; f LDA ADDR_TO+1
* `. r9 q/ r5 I. N) u STA ADDR_DATA_TO+1   ;设置目的起始地址高位
6 ]  E6 V' z7 S' h 5 [, I6 v. Z) ~/ I
OVER_COPY_CMP:    ;复制完成比较
0 j5 O8 b: c" a& ?/ L& L/ J LDA FLAG_OVER( e! E1 X2 f. _5 v( W
CMP #$FE    ;复制完成标志比较
3 o/ G& R3 q- y4 n$ S; s  b& @ BEQ DATA_COPY_EXACT" P8 [, \2 R$ M0 ]

- n, {6 G0 f  [) H8 ]& bINI_XY_COUNT:   ;计数器初始化
6 Q7 v2 P: S* m/ _, }+ |0 F% h LDX #$001 r9 S( R$ ^3 }
LDY #$00
, {/ x4 Y& h9 h) @ - k# P( {; x9 |& U
COPY_OVER_CMP:    ;地址比较
' I2 p- ?7 w5 V% @, I- e4 l LDA ADDR_FROM_START. P* R0 M# R+ ?+ s) F; r( Y# `1 r
CMP ADDR_FROM_END% N" I% x* b: s7 N$ H
BNE COPY_START# |# W% K7 s9 K$ C' e; M- H
LDA ADDR_FROM_START+1" k8 v1 o2 S, h3 E! K$ B* a
CMP ADDR_FROM_END+1* P4 |9 N) Q) s  e8 r
BEQ COPY_OVER# t. }' I! K0 _  a0 e( T8 b
+ Y5 ^. r  t# B4 I
COPY_START:    ;数据复制开始) j2 x" k! b( s9 B6 I
LDA (ADDR_FROM_START),Y    ;读取源地址0 Z0 c$ ~; D- v; n# a
STA (ADDR_DATA_TO),Y    ;写入目的地址2 ]2 Z1 k( A; o2 u( c4 s1 ]
INC ADDR_FROM_START   ;源地址低位递增
- g4 _$ s" M6 |! c- X. A/ N& z9 N, q INC ADDR_DATA_TO   ;目的地址低位递增0 X- ]5 y3 O( \* |& g: T& k# R9 e3 I- ]
BNE COPY_JMP6 Z% }1 ?1 o8 O+ Y- h: X1 ^
INC ADDR_FROM_START+1   ;源地址高位递增9 k3 L! K6 Z! B
INC ADDR_DATA_TO+1   ;目的地址高位递增2 B: P7 a) J  F. c# T- E7 o! ]

; I& x0 M% Q7 G: j3 wCOPY_JMP:    : r: O' q' S1 w9 x9 d  y4 Z! j
JMP COPY_OVER_CMP! L, c9 C+ |' z

: J5 w. ~7 V  e9 iCOPY_OVER:    ;复制完成
, N( U3 `, R, C: B; |( B: g LDA #$FE% ]& J; e( V) D
STA FLAG_OVER    ;写入完成标志! d7 U+ P* y/ {  |$ `; K7 _5 G
FINAL_BYTE:/ k! ]+ F; ~% c: m$ a3 L$ K$ \
LDA (ADDR_FROM_START),Y    ;读取最后一个字节
$ K$ e7 N( r' a1 r$ o) } STA (ADDR_DATA_TO),Y    ;写入最后一个字节
) A. q; f" S- ^4 t$ r, Y: E
2 q7 U: G/ E5 p9 R; tDATA_COPY_EXACT:    ;恢复数据
' U& `2 ^) \: m4 h# Z LDA INT_ADDR
2 i/ @  s: M6 w& I+ s' n* S STA $2000    ;恢复中断1 {/ @0 t1 c. D& {' ^
PLA
' X$ k3 @% X; m STA ADDR_FROM_END+1
! w. R7 e  t6 a: ] PLA
0 @, t; E3 V$ ^7 ~* C* L9 E STA ADDR_FROM_END
2 q+ C4 M+ j& f; c) x PLA
8 E) r7 v& |" R7 j STA ADDR_FROM_START+1
2 [$ T: Y* i/ E+ x* Y  Q PLA
, |# \' K* a, l5 I+ @1 X STA ADDR_FROM_START
; i/ q& v4 F: b/ d; _ PLA
& t6 N! c2 z+ j& k* f0 O6 N2 W8 o STA ADDR_DATA_TO+1
4 S: b4 ], u: F. M) ^  w: \ PLA: i/ ]9 f' U2 U7 D3 ~
STA ADDR_DATA_TO, i- t2 M' O/ M3 ]0 o5 [2 T' O
PLA& l' G6 i/ c) b
TAY; @* b! d5 t* I/ F- A
PLA: d6 n1 ]6 \; x5 ?
TAX" H3 G& W4 }2 Z3 |+ Q4 M
PLA, e9 y" E5 {0 c
PLP
5 g$ y& i* u. ?$ i) X
, q4 x* g5 }1 J, M( H + F  O! y* l4 a( |
+ U/ D# L: S! i* n0 P
DATA_COPY_RETURN:
  K' i! ^0 x2 Y8 {7 m RTS
4 O9 R* E4 B% j% Z ) }$ l  O6 h6 e4 b
.ORG $C056    ;精灵指令覆盖
8 e' B4 ]9 I! \+ [/ s, y+ o JSR $FFB5
5 x" n  {" W/ @
8 H4 G$ Y% y0 l- @! a: q5 M/ N .ORG $FFB5    ;
9 M# g8 V1 L+ j0 O, ]( p PHA0 n  R' i; ^5 N
  TXA/ i& b2 c) O3 |1 p% J- X6 {, X
PHA
( S: M" v! Q% \: K- ~ TYA/ q8 ]1 e' b" S8 }1 j3 i/ s, X( H
PHA
* `0 [0 {9 h$ v; }6 y+ V, E- F LDA $71FF    ;比较7000-71FE数据是否完成复制3 \3 z# v7 I/ U7 T
CMP #$FE+ O% V2 r" |3 n( g3 H8 K6 ?
BNE ADDR_FFCA: t( ~  b% g" z) K1 c
PLA9 @, j3 A% X& @) N" v3 t
TAY1 ?/ D7 N8 u2 W" @6 }
PLA# f6 h- Z, U6 x0 m& F; G4 A
TAX8 z' e4 n! v4 K( d
PLA
  V3 k& ^* p" e/ A JSR $7000   ;跳转到自写程序
3 E$ [7 A* W3 w/ T% d8 N RTS
: Y+ V* l1 r8 S2 Q3 q5 D0 qADDR_FFCA:7 N& C7 X9 u$ G9 |% l
PLA
# J+ v1 H, _) Y  ^! i/ N1 } TAY2 s: A1 B, N1 G) z# p) H
PLA0 T% B% m5 w+ K
TAX- J" ^6 _9 B& i1 K
PLA
# m! e+ q/ M# B% Y2 W' T4 d; g RTS2 ]6 C2 R! M! \9 |+ [. \
3 z1 W" J7 s8 ~! q4 L
; E4 s  i% x5 X% u# u. k/ X
6 H* R2 n6 h. J" U( H1 L1 Q
.ORG $C264    ;自定义的MAPPER2切页程序& Y" s6 l( K$ E% m# C
PHA- ~6 O3 p9 k8 h& z
TXA) d& y- ~5 B2 l" _1 C
PHA
. k  f1 ^* j6 C# G$ Q3 V: T LDA $0066+ u, J7 g2 X& y  N) ]7 V; `" H+ O
BNE ADDRC280% r# w; s# M9 o% s7 m) x( h
LDA #$07% A: _" b- p0 o1 |5 v) w
LDX #$039 S; g) E+ d4 q0 V
JSR $CD9B    ;自带的切bank方法& s  @$ @5 x- V( H- _  _
PLA% t8 L3 r. m) w: T8 t/ u! q; P
TAX
& E# V+ H; k* x/ V9 ^6 e8 I  J PLA
1 S% A8 O, t* W/ p9 C3 L. I JSR $80006 S- Y, o! E' G& P4 l% y# J
LDA #$060 H1 [; a& d3 I) s2 f6 X/ h; t2 t
LDX #$03% T0 ?0 b- d  q
JSR $CD9B    ;切回原该切得bank(可以不用)
7 ?6 O7 p* J* ^# B5 p; [8 N RTS1 z0 [1 w. Z) H# y2 k
ADDRC280:/ v; D% l2 V9 W3 F+ `
PLA4 f. Y# T- d& e/ E0 a
TAX0 x7 S" H- V& m" X
PLA
; h) J1 }5 ^6 c# f/ I RTS1 }. R- h0 x3 M3 u$ a
6 x7 ]8 _% P9 h' X
3 ?& b( @1 |  B9 ]
;[FC][最终任务PPU][END]0 `* q9 d) ]: ]6 B6 G( Q7 s
.ORG $C056    ;跳转到PPU重写程序
7 s0 y$ Q( C- c' g: M( V JSR $70004 a2 C; J; f& s0 u% u& e) [

3 }, J/ g+ z. \6 I .ORG $CEBF; \' }7 {$ F1 Q+ P
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
, T: T7 u5 @) v: j& @  , [9 t/ Q' c. o, Z# M  g, H
  .ORG $E460# U7 y  g! e* F$ E1 C+ O7 V8 `0 b
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
; ]' V: E' W' `, W4 L  4 Z# D. J+ S# |0 D1 w8 L) h1 h( o% ?" G1 B
.ORG $71F0
5 i5 l% ]  u5 QSTAGE_DATA_WRITE:
5 n, h  r7 T6 E; I- s  LDA $6010  W" `! w. w4 y* P# [6 I  h
  STA $1E    ;关卡写入6 V6 i9 W" ]/ m
  LDA #$00- _  x0 L0 z7 [; y5 H
  RTS" K5 t+ z) O2 Y: ~
.ORG $71C00 \0 `, }8 u3 s7 j$ K
BULLET_DATA_WRITE:    ;副武器数据写入- d- B: q0 X" C0 e2 q( D
CPX #$0E
/ M- h. x; s% ]0 e0 j2 H% j BCS P2_BUL
. j, |! n/ G) v" d' }9 g' yP1_BUL:* T& p( q8 F, }
LDA $6004! p- X% D8 V5 X& a
JSR $D7D0    ;P1副武器数据写入+ W' i2 U, t) t$ e3 V9 h
RTS8 h3 E$ {4 a. B
P2_BUL:3 [1 ?% p5 E; T- L
LDA $60058 |- j! @; O6 v, D. f4 A+ H" Z3 M. R
JSR $D7D0    ;P2副武器数据写入
4 r  a: h" J: {; Y RTS5 o3 X' |9 V! V% u

- e' N1 o' P, z
& F0 F* j2 s- M; V$ ^ .ORG $70000 p( t6 K. g" X0 i5 m$ L$ m
  
; T" H8 b: C3 I2 f0 k7 J9 f2 f* | STY $4014    ;补上覆盖的精灵写入指令
5 @- V: R4 H; y% e+ V PHA4 M# v2 w7 V; P2 e" W0 C- Q. z
TXA
" y( e' z* `: D0 v1 x" R& p) h PHA; Z; M0 `! f6 h: F0 N- r
TYA
! k4 [- S1 i  n PHA
1 S4 v) n) Z' j LDA $0C
; r7 W( g  h; w( v4 b CMP #$01    ;比较是否为标题画面; c* L2 J+ r8 m1 O( Z/ `2 A
BEQ PPU_STAGE
8 B! N% K7 N7 U) b' e PLA0 J% m3 L' B) X. T- j
TAY
3 R9 F% r* H+ w5 C& B# p PLA
3 k1 {( l! C, O$ w TAX; Z. x  p* j9 `% e7 {9 y- J
PLA
& [. H0 s  l$ d* ^- ^ RTS9 |, L9 E  C0 _" t; A' J+ S
PPU_STAGE:    ;STAGE显示程序0 r' i# e8 c4 Q! ?" |3 B. P" [, S* J
LDA PPU_ADDR_DATA
; _7 j- R" \8 E5 ~& o STA $2006
/ Z7 ]: z; d& j! q- B1 V. N LDA PPU_ADDR_DATA+1; a/ B' m( m7 Y7 }* \! w/ S
STA $2006    ;坐标设置
# r+ y2 d: V' b0 r LDX #$00$ [( B5 i6 x: A! P# q9 O
PPU_STAGE_WROTE:    ;写入STAGE字模
1 R9 |3 `' s( u- t LDA STAGE_DATA,X
8 V  Q4 {8 Y2 |" h. t STA $20070 R9 u' @4 w0 e$ e( H' q
INX0 J3 r* _3 d8 C" Z+ o
CPX #$06, t$ V; {* C: |# z* L( ]
BCC PPU_STAGE_WROTE' ?0 I/ A( Z5 b3 F8 S
LDA $6010# X8 l$ X4 E& ^( f( O
CMP #$FF    ;关卡数据初始化条件判断0 s1 u7 M) C* z
BNE KEY_B
2 A! g* H# j$ H  P0 q LDA #$00, A6 m! y- j3 _9 j; Y
STA $6010    ;关卡数据初始化& w* e- T  k7 B9 b6 \
KEY_B:    ;关卡减少
% Z7 Z- s8 Z7 Q* M2 A! _. ]2 t LDA $04
6 [3 T! P( U4 A, F1 C: y( V/ o8 | AND #$42    ;按键B或左减关' E+ W/ u$ s0 L2 K# n$ U) S; ?
BEQ KEY_A% g2 r  c1 n: t' u2 j" i
LDA $6010
6 e4 g7 N( v6 M3 R+ ?4 k5 T' K- k CMP #$00    ;关卡比较
1 [: R) L1 E" }9 x BEQ KEY_A( c. L5 A& Z9 Q
DEC $6010   ;减关
9 x6 ^8 e' w+ J8 K' E1 N( gKEY_A:    ;关卡增加, S. R$ x! I& E! S8 t$ p- X
LDA $04
* C2 V% n3 r; b" |) {' c1 { AND #$81    ;按键A或右加关3 G9 e6 X2 d# v% R/ f* E1 j
BEQ PPU_NUM_WRITE3 O' m) A0 A5 q& }+ c, I7 y, L' X
LDA $60109 {; `2 T$ T5 D
CMP #$04    ;关卡比较
% N/ t6 ]0 B1 l8 i- x; D1 a6 f BEQ PPU_NUM_WRITE
2 a2 d' \) a+ M' r9 v INC $6010    ;加关" l1 A! d* Q7 ^! G) X
PPU_NUM_WRITE:$ ~' M; p" ^& n
LDA $6010! u' c! r7 n7 n+ i
TAX# ]' R/ m6 \# y
LDA STAGE_NUM,X    ;写入数字
% B( C! q; L9 j$ K1 b( C' c) ^ STA $2007
& p- \  H' ?1 ]PPU_RTS:
( O4 h( |2 C" w5 H8 [ PLA& q, k/ }# H- @" I
TAY9 q, K$ n5 R/ ]9 Y! {& \
PLA
3 o2 l- ^  G" ^* h7 ?1 F TAX6 ]8 h7 v) p. B1 I* `0 q
PLA* x/ V) G9 G# |% Y0 u+ e
RTS
  Q1 J2 N, d" e) x6 Z : R0 s2 Y: v1 M8 O, A
1 Q4 R2 ?3 a3 I* t: y: u
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据
; g9 d# c  _% q; X( v7 W+ W .BYTE $EC,$ED,$DA,$E0,$DE,005 C3 W% X9 g3 h
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据. W$ g8 a0 y4 f9 J
.BYTE $D1,$D2,$D3,$D4,$D5
9 c" j( k0 v1 L$ D; w
8 j! C* l0 j* K6 S8 @5 @( q' UPPU_ADDR_DATA:
; E: C8 I* V: T! z: q .BYTE $23,$0C
6 k) J* L. t, p& F# I
0 N8 m6 l) z$ t7 q8 O

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2025-10-30 03:46 , Processed in 1.072266 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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