EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
* r5 F1 F5 R$ M* Q; Y5 A$ x; D/ u; b3 j. d* c& \" A3 u
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.( @6 K( B. Y$ u4 S1 q
然而,今天想到一个思路.
5 g# T; p$ F' I% ^: Q1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
* W3 ^& Q" |+ H! P6 i( ^3 o% o7 q2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE4 U9 \: I, @4 h
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
, Z% U0 C# }& D" u9 P) n' G. Y+ F2 a& X5 q
0 @3 D+ g0 k# L7 a
;[FC][最终任务KEY][END]
8 S) y* s# Z! I5 Bbutton = $04    ;单次按键5 q* c, m' W6 o  e
flag = $6000    ;功能开关标志: K5 B: N7 x( z
pause = $000E   ;暂停地址' V' Z, j: t$ H) [0 _/ o

1 p' Y: i0 Q0 @4 ~- m' } .ORG $8000' g0 F* F: _: |+ k1 f; x! I
LDY #$08    ;自带的按键程序
$ R! K3 U' B  C4 f: |. hADDR8002:
4 N& S8 w/ ^, ` LDA $4016,X
& p2 [4 \: [' \( A LSR( a* \8 \! `% e. q
ROL $0021
/ l7 B, o& H: v4 x LSR
' ?$ f; j6 r" @# y& g ROL $0029* ?0 @9 X! N, _( D9 w: H: X" G
DEY
7 `/ ^/ a7 L- _4 E+ d BNE $8002
* M, f' ]; I# }2 E/ L1 |: W! _ LDA $00211 L5 H9 f/ e  k8 N8 @& _$ C
ORA $0029
* l8 X8 g7 E& X5 u7 l  q4 Y STA $0021
, a8 @5 |( F, N. R$ ~" ?/ y; a6 C LDA $0020
1 P# W* ]6 i7 I( F0 j9 P0 U AND $0021
3 Z0 w9 _& K2 m4 d' n1 } STA $0020! C6 w) @* ]$ l3 ^
LDA $06,X, R/ ~; U! M/ ~" o' I
EOR $0020# {4 d' c$ Z1 @* w2 w
AND $0020
. b& A4 }# k, R3 v STA $04,X
: N% v4 L$ F2 @; C0 S, T8 ?* o LDA $0020
) {* g3 a1 P% }, t STA $06,X, V/ m8 w% n) M! a% T% _
JSR KEY_OPERATE
$ ^/ M$ n0 {8 [  ^( V JSR Function    ;功能调用
- C+ q% L. ~/ |6 g8 S) ] JSR Weapon    ;武器切换调用, U" U9 ~  F5 s) U& d! q# _
JSR Power    ;威力调用
; o" g( R& n* K" n0 o$ F0 | JSR BULLET_NUM    ;子弹数目
4 H8 ?7 f+ n8 j; U7 w! J/ v0 } JSR BULLET    ;副武器类型6 W7 m$ ]6 w( h. f6 a. R
RTS8 _/ M5 H: N; w' }# V6 A) M$ `

  v. s* P3 c- |  |; {" f ' b: \* k9 ~7 G: A% `
# F5 M3 G* A+ r3 q/ Z7 g- R' V
.ORG $80501 K# A2 H! f3 K" @' o( [1 b
Function:    ;功能
% E! s+ C8 x# H, F. ?; ]WUDI:    ;无敌
7 u: I, u1 X: M, A+ \: o. m LDA $6000,X" |2 _2 }7 U" \' h: f8 d3 x
AND #$08    ;开关判断( G" [4 N( z8 E0 H8 X2 e" c
BEQ LIFE! v8 L% Q6 l4 V% e: p1 l
LDA #$05  e, @$ H0 J, P) y" b/ Y+ ]
STA $05DC,X    ;无敌锁定
% j8 O1 v0 f+ r0 `) w( dLIFE:    ;生命
9 E+ l. L5 K5 Z& R# S& A, N9 r) I LDA $6000,X
$ X3 @; }: N' W" u* U AND #$04    ;开关判断
0 _; t7 q* b/ i9 q) @) M BEQ FUNRTS
3 S6 I4 J3 K9 Y7 N* ^: [  a3 { LDA #$05' |3 g8 T9 A: b
STA $1C,X    ;生命赋值, ]6 J( E0 S) G6 S0 J% _5 {' |
FUNRTS:
+ F& c1 F0 S$ V/ Y! z: t, _% W RTS
! @# [$ K% j$ r
) U/ s2 x; w% g3 Z; [: t# T% ^9 rWeapon:    ;武器切换
3 f, e% ]8 L, D1 C% F$ L) n/ E LDA pause    ;暂停状态判断$ i/ Q5 _; q( A5 \, F
BNE WEARTS6 G' {2 w1 |' L3 z- N2 `
LDA $04,X
3 ?+ O- p, L7 L3 j CMP #$20    ;选择键判断
2 U6 h" G/ }4 D: E) C8 Z BNE WEARTS
" J1 k0 R, [  @  V LDA $12,X. l/ i( W3 a0 u
CMP #$03    ;武器值判断
2 L; I: b, W3 R6 j% _# z6 N- [/ _ BCC WEAINC: v9 T" M) r2 h. f6 ^
LDA #$FF
. y7 l& B0 |% b7 z: L; { STA $12,X    ;武器重置; a$ X6 l" |: R( r4 j# J# d
WEAINC:# A# U5 ]- S* B0 O
INC $12,X    ;武器增加
1 F! h) L4 u  z/ ^) e# a " ?5 B0 j% x4 R
WEARTS:
) ]5 j) Z# l+ a% c% d RTS
: ~  [" V1 R! L! d
: P2 ^5 f( [/ X, BPower:    ;威力
2 I( v9 g6 `) q+ |9 |4 K LDA pause    ;暂停状态判断1 ~( E) W) a5 f+ l7 y+ y2 M' ?2 O
BEQ SPERTS
4 c- v3 ^: `  w1 |BUT_LEFT:
4 F/ u; W4 s4 T% u2 G- j$ S LDA $04,X
, u& _5 p4 w3 t& V1 p- z CMP #$02    ;左按键判断
1 h: o. M" }9 \/ _: Z+ O0 ^) O+ i BNE BUT_RIGHT. O' f& w+ C9 U( e/ N. m
LDA $88,X
/ f% X  l8 z: [. L2 P' G CMP #$00    ;威力判断: q3 D2 T* y$ k- {# z
BEQ SPERTS0 w; W9 M: A+ h* g% Q
SPEDEC! w. [# O$ L& m
LDA $88,X    ;读取武器值
/ q  }4 V$ s3 g9 o SEC6 U- R8 w' T" n
SBC #$08
  C$ U6 D+ O# ~, ], B* _* T STA $88,X    ;威力减小
7 o! D+ Q2 o. @7 W- yBUT_RIGHT:9 Y) T) G8 f. T1 ^7 M0 t
LDA $04,X3 p' I, Z0 n. X
CMP #$01    ;右按键判断+ R. v0 F1 w% J( [
BNE SPERTS+ X9 _" _0 n8 d: S' p, ?5 k
LDA $88,X
; v- G& q* A' `. W* C  y" s0 s CMP #$10    ;威力判断
3 D0 f+ X. W2 \- A% k8 A BEQ SPERTS9 b$ B) z2 \) u! G, q; L
SPEINC:
7 J  X+ _# o2 T3 ?" C' P7 { LDA $88,X    ;读取武器值
- Y) u; u- j' b) S CLC8 I  [+ q, `8 l3 C
ADC #$08/ _' r. u7 [) X
STA $88,X    ;威力增大$ j3 n7 X9 s, u+ U+ d" G# Q1 y

, b  |( N9 b  o' RSPERTS:
6 B5 Y! R  c! K- ?: ]: ]+ | RTS6 }9 l! v- a* F; s$ G  B7 D) c8 N. N
2 I4 r# Q! |% c3 w/ f9 r+ b
BULLET_NUM:    ;子弹数目
8 |, \9 Z1 A4 |: O% [ LDA pause    ;暂停状态判断! g8 G! n( R5 x- Z+ o1 m' X; f! |1 P
BEQ BULRTS
4 s2 D  V, |% A4 |: N$ \ CPX #$00    ;主机玩家判断2 v! j3 K8 ]: F  {6 Q
BNE BULRTS& y& J4 P9 W+ K  X* ^' d
LDA $04,X    ;主机玩家判断1 Q: J# Q% S4 d* ?4 L
AND #$80    ;按键A比较
2 T3 D" v& o+ U& J9 L' I& C BEQ BULRTS: n( _; v: V5 L9 X' C& P  q
LDA $87    ;状态判断6 p# X! _* X8 c
BEQ BUL_2
. W! E- x: [, eBUL_1:
/ _4 h1 Q* u6 q  S1 V LDA #$00
. L/ Q. Y" Y, P- |: A: {' U STA $87    ;1发子弹
2 _% _- c, `' O BEQ BULRTS+ Q, t$ T) X  |4 `' B$ G
BUL_2:
: G1 L' s) l+ g1 R LDA #$01$ C) r6 U4 t) m" C% z2 X7 T
STA $87    ;2发子弹
0 |8 x) |( b! K& }: H3 d4 Q - d1 Q) }+ T$ `6 K$ Y# T4 H
BULRTS:
& @" Z. h  j. z# F RTS
* z: g: q4 d& G  v& N
. Q3 ]8 F; b1 a: I3 [$ k) p- \9 d8 Y' t% e# a/ j
BULLET:
( r0 R9 W+ o% J2 v: `  z LDA pause    ;判断暂停状态4 k/ m$ w. |: B
BEQ BULLETRTS; k3 N2 G1 p" H2 J
LDA $04,X
3 F* {7 c$ Q! `2 \ CMP #$40    ;按键B比较
( {1 W+ ?: ^& j5 _4 r) K BNE BULLETRTS
, J8 Q" u1 F4 a# f9 |! R) V7 W LDA $6002,X    ;读取副武器- W& c, E! w9 T% @' H
CMP #$03: t3 |6 A7 P) I
BCC BULLETADD) s4 Z" R' r  H0 G3 l* F( r
LDA #$FF
& ^9 j3 o3 h+ _8 ? STA $6002,X
0 p! D- i# M, ]3 `6 `3 c$ fBULLETADD:, d8 p$ f& G5 u4 q8 x' Z7 W% @
INC $6002,X
3 U; z& N. J! t9 u- [
+ z% o/ H  [" L4 v- cBULLETRTS:
0 ]/ J' e& ?" k" s. o" K6 S LDA $6002,X* O1 \# n: N# a* u# j
TAY
4 p' {  I! N: U$ r) c LDA BULLET_DATA,Y* s! i1 u9 r7 m% f# V. Y9 V
STA $6004,X    ;写入副武器数据
% j1 {* o/ c% @& x; O) D RTS
- L% w9 K. ~. p0 k; W . B- X8 j0 p1 H! [( [
( ^, j- S. q- y
BULLET_DATA:, e7 _2 J4 I8 K2 t
.BYTE $06,$02,$03,$04
7 b* P; D; H. w7 g# h' H+ o/ j 1 I. k# l8 `3 T% ~  e+ v

  I. q1 R' A) `' e' N 9 |' ~6 X# }& p5 S3 R  A8 ?+ L
KEY_OPERATE:    ;按键开关操作( k8 g# I+ ]3 M% o: Z3 K
data_protect:    ;数据保护
' ^+ u' r; \2 D, r& g: g PHA
; x. u- F  d& J7 ~ TXA
) N2 A& Y& L; \3 n PHA) Y/ H3 F! {& I
TYA
0 [" g. x2 {" w& z) @1 F! W9 e PHA# B, _& N. M9 l; ?" j6 T
) r8 Z* h7 e, E+ S# ~5 m1 b8 t. B
FLAG_INI:    ;开关标志初始化
" N) m5 D0 _1 o5 |. ?- p. O9 X' ~; m, \& t- M
LDA $600F. r! K- E  Q& A1 f+ b0 U
CMP #$01. c( F+ z3 q8 x  H
BEQ pause_cmp6 p$ s6 Q- i2 a, q, z4 z
LDA #$00. v( _  t2 n" N" b" j
STA $6000' l0 [+ ?/ F/ G( Z  C5 H& I
STA $6001
& X5 z! D+ Z9 A/ ` STA $6002: ^- G8 B0 Q. D9 Q+ I6 Z# H
STA $60039 Z: L$ v( S. C
STA $6004
) i2 ]0 i& X: G6 E; M- c STA $6005
& ~: Y1 I2 }8 b. O( i" f3 `# d LDA #$01
# j* @4 r) I$ M8 j. e+ Q STA $600F
0 l7 A& k) l3 g/ f% ^  G: T1 x
& C- C$ \+ |8 v: K' A0 h4 g; N0 cpause_cmp:    ;判断暂停状态3 c& u/ `' x$ x& o
LDA pause/ n5 }8 t3 g" ?: z2 V5 q) }; X
CMP #$01    ;判断暂停状态
9 o1 p6 O4 p) Q* H' `  [  v BEQ button_press, b. G1 _/ b9 y. P7 [4 g
PLA! s, }( d6 V$ Z. I
TAY
$ |  f8 Z8 H$ I. R PLA
- Q! y8 S! k3 g: B2 e TAX
" Z3 U' _! R$ W4 @9 u" w PLA6 v5 `' S* E, p6 `+ ^
RTS" a# e" C) h$ L% n

# o$ ^, o% v4 V6 gbutton_press:    ;按压操作
4 ?( P1 `+ j4 O7 pini_Y:
: Z) J4 v. _1 ]  a+ F" o LDY #$00+ _) K, N# D: X. I7 O! f( ~7 b
button_cmp:8 [/ E: R% w( ^! u- _! z- U
LDA button,X
2 @" _' F3 m2 I  ?" ^ CMP ora_data,Y
4 g0 d# Y* T  b5 } BNE count_Y_cmp
: z+ ]3 B; @5 Tflag_cmp:
' Y( y! \( ?# _: I5 `  @ LDA flag,X
1 m4 U& h5 q% J2 m/ j AND ora_data,Y6 S, u& C) ?6 O0 s  i' c
BNE flag_and/ z3 Y1 Y  I& r8 x" @
flag_ora:
  u5 g# \! G' m: A  o9 J LDA flag,X
5 k, R# V+ [  k ORA ora_data,Y
( ~  J7 j1 n# y$ A4 v% L STA flag,X9 A3 C8 k! D5 |8 r9 j- B% L+ r# ^
BNE count_Y_cmp
! S6 q& Z  H5 [/ @flag_and:
) K+ Y* |4 k; M LDA flag,X
3 X! N; I5 M8 D. l9 x AND and_data,Y
' p8 f! V8 B' u; }/ d; B8 e! d5 M STA flag,X
- u- j1 u4 i, H  h2 B/ V8 lcount_Y_cmp:. I# O8 F. S  R5 T4 }, U2 P
INY
+ w5 D& I$ u4 D9 y4 o: ` CPY #$08
* M1 J/ L2 J0 h- c. Z BCC button_cmp& C3 k% a& Z/ O( U

  x& `* Z. ]: _, \5 \" Tdata_extract:    ;数据恢复
7 i/ ?# u" B. h4 Z5 ] PLA/ f; {2 ]2 t9 ?" e) j0 ?1 u. D
TAY4 L/ K7 o1 P0 j9 Q
PLA7 `7 B& ^! q7 L& F# x  J! i* c# x
TAX
5 Y0 j" Y1 u+ c PLA& i2 Y' a. n! Q9 N  O- o3 d
6 G2 ~* t9 E% s; h! S
return:
0 \6 M+ j  A0 Y6 C+ p RTS8 U9 ~3 ^5 e, O# i1 Y' h7 y7 }
" H0 O" l* R) ^5 L1 h8 ~* i) ~
ora_data:   ;按键相或数据& r! `( S& s( W9 k$ e$ E. M, @
.BYTE $08,$04,$02,$01,$80,$40,$20,$108 K% w3 K) S. _# b) E& }
and_data:   ;按键相与数据
6 O: F8 b1 b# G' n: a/ ^2 h9 G1 h .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
8 g  V! k8 S4 S0 Y1 x( j/ F 7 X5 [: Q' [9 G( n  p9 R0 v+ S

6 T$ f6 [' m- h9 u% X 4 ~- _6 e$ i' R. ^+ {8 ]/ W
;FC数据搬移程序 BY FlameCyclone
2 a& w" L. X+ n5 P; P! ?1 Z7 g# _ .ORG $8200
  C3 O' ~3 B2 Y JMP DATA_COPY_PROTECT
- y3 p7 B9 V/ H. p1 E
3 V+ ~& O4 V4 H' A! AADDR_DATA_TO = $40    ;目的地址
1 x* q5 a  k# PADDR_FROM_START = $42    ;源开始地址
, i  G5 R1 P# p; g% L# YADDR_FROM_END = $44    ;源结束地址) n/ M8 R8 ]& J+ t" P

5 |9 Q3 f" l1 p6 j0 U+ AADDR_TO:    ;目的地址
( b9 {9 z7 B7 }$ I1 Z .BYTE $00,$701 [9 ~* i1 K6 v
ADDR_BEGIN:    ;源开始地址3 p2 X- i6 A" M2 V
.BYTE $00,$83
0 _1 ^, O& F; R0 v0 cADDR_END:    ;源结束地址6 E* P: A# b# e- q8 @, r
.BYTE $FE,$84" g# _' d" O5 L  O

. r  ~4 @! ?$ j& K) XINT_ADDR = $08    ;中断地址. H. O9 t+ ?5 a% ?( j: a) I
FLAG_OVER = $71FF    ;完成标志
. p. ^6 N0 ^  @5 l1 `
! h9 j4 I* J; l" I8 `0 @9 Q7 M# r* M, r( @+ {8 [7 {; Z2 N
DATA_COPY_PROTECT:    ;保护数据6 ?, I5 I$ e. r) D& X' `9 G
PHP
  x6 b/ y9 W( S9 z$ Y& E- z- { PHA& S% l# o7 s5 e5 A! C
TXA
+ B/ D& [8 b  ^1 y# @) X$ h5 {1 C7 s PHA
, r1 l$ b' s. }. @" | TYA
" Y3 _6 l5 q! h, _ PHA# J# i& F, Q0 D" t" Z
LDA ADDR_DATA_TO
0 {: O, c! Y& s! h PHA
; A% k% v; E1 U" a, O- _ LDA ADDR_DATA_TO+1
) H; w+ u. {; \( m1 c5 G PHA" \+ r8 [# D% {7 h
LDA ADDR_FROM_START
0 x% S, Z* ~0 W" U PHA
+ N6 c+ }; J+ t" t$ D LDA ADDR_FROM_START+1
7 n- G- g4 E6 P" n7 e8 ^% ^ PHA
, w3 J9 {! j  n# x* [8 ?- [& W LDA ADDR_FROM_END
1 d0 \* i# y) X% V/ L PHA# x' D) t; q  W6 M4 f$ B
LDA ADDR_FROM_END+1
& s* f, m: O+ @6 }4 o9 q PHA
& b* R- N. N6 G
0 V! S6 |7 J: G, |OFF_INT:   ;屏蔽中断' ~# {, G3 n3 r) S/ J
LDA INT_ADDR
3 q, ^8 |4 G! L* Q( w3 ?$ H AND #$7F  |" t% l! f3 q& t* q
STA $2000    ;屏蔽中断
" F) u, e4 e# o/ r, I9 T* M8 a
" K6 q5 Z' Q2 ]9 Y/ G( g9 i3 n ( m. `" {6 I$ M9 _$ y& f" G7 J" h; P
SET_DATA_ADDR_START:    ;设置复制起始地址
  e% H- w1 h& T. P- X& o3 i LDA ADDR_BEGIN5 Y* F2 k3 r# @" Q' r
STA ADDR_FROM_START    ;设置复制起始地址低位
# d4 h! T+ A. \& G- Z LDA ADDR_BEGIN+13 |6 B7 t$ h4 w
STA ADDR_FROM_START+1    ;设置复制起始地址高位. U$ ^& M  }/ j6 A5 q) S

' T3 q7 s4 I' C3 ISET_DATA_ADDR_END:    ;设置复制结束地址8 G3 x2 c! z* T4 ^2 Z; J# s
LDA ADDR_END
4 L1 N/ C/ F4 h& x) F STA ADDR_FROM_END    ;设置复制结束地址低位* E3 g/ L1 g7 D
LDA ADDR_END+1
) n" A# J: p' N4 c3 h# s" t4 c STA ADDR_FROM_END+1    ;设置复制结束地址高位( @( E% J+ R5 P

7 \* L9 _0 G7 a0 A* b3 LSET_DATA_COPY_START:   ;设置目的起始地址9 g$ f1 B8 u* C3 h; {1 y& M3 z/ o
LDA ADDR_TO3 @. ^# F& J, X# c. d4 u
STA ADDR_DATA_TO   ;设置目的起始地址低位
- N4 c: ?  v( }' P LDA ADDR_TO+1/ h4 r- B0 D/ l, g
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
1 n, D+ u  C$ [/ V0 g6 M) l# w ! ~& E- W! |# F3 h% g
OVER_COPY_CMP:    ;复制完成比较! W( J3 {# _! r2 ]" s" z: S
LDA FLAG_OVER% i3 A" X5 J, W# l% E6 b4 j- e/ a
CMP #$FE    ;复制完成标志比较0 G0 t9 n' v$ \
BEQ DATA_COPY_EXACT
5 Q1 o1 v6 _# ]2 w$ [( Z+ C+ ?, l/ c% f2 O+ _7 s9 v$ k8 d* q
INI_XY_COUNT:   ;计数器初始化: Z, O9 W3 B4 K3 {. l7 O
LDX #$00
: p7 Q- X/ H  |/ r  l3 E: I LDY #$00: W$ \; r5 V& V/ Y. a) \+ E
5 j' C! N" D5 b  v
COPY_OVER_CMP:    ;地址比较" [! Y, ?* o! s# z
LDA ADDR_FROM_START" I9 E, x- }$ F+ @% `1 a' E* b  I& _
CMP ADDR_FROM_END$ r6 U. A: T6 O8 Q3 a
BNE COPY_START  Z6 X1 o. G* r: i1 @' i  C( R' v9 J
LDA ADDR_FROM_START+1
- P6 q0 R* b! O0 s" T1 { CMP ADDR_FROM_END+1
8 M  ?$ S- u7 M! m5 M. A/ Z BEQ COPY_OVER
3 ^$ L0 e1 M9 v' h7 C6 E, Z# @' B ( @1 o, U- v: x0 L6 ^
COPY_START:    ;数据复制开始
! s7 g, _! y6 K" G& w LDA (ADDR_FROM_START),Y    ;读取源地址
" W% l( p6 U4 H7 x3 f STA (ADDR_DATA_TO),Y    ;写入目的地址
& }1 w0 R* z6 X4 Z" P, O INC ADDR_FROM_START   ;源地址低位递增
( y$ d4 V( Y& l$ _  [0 o INC ADDR_DATA_TO   ;目的地址低位递增
# i9 C2 j0 y( v" j9 R  M* C0 o' W BNE COPY_JMP
  b: D5 o# w1 h5 X4 E4 Y# }& g! }, Z INC ADDR_FROM_START+1   ;源地址高位递增7 _( @) o7 s& Q* e
INC ADDR_DATA_TO+1   ;目的地址高位递增
, u9 n1 `% X1 O- m1 R 6 x! c8 ?) y% \. Y& x
COPY_JMP:   
4 [. D# G  R$ ~5 E$ h+ X JMP COPY_OVER_CMP
: v% t' T, w9 E- o' ~
- K: J) d: _' [! G) ZCOPY_OVER:    ;复制完成
4 W8 e4 f: @! n' c LDA #$FE$ P" X% s% f$ A5 K) E
STA FLAG_OVER    ;写入完成标志  E( M- t8 m2 W1 C8 C) ~1 Z
FINAL_BYTE:' n' `: B2 P! X# {, S, D% k" x
LDA (ADDR_FROM_START),Y    ;读取最后一个字节: O% I- t+ L; N! a% u& W
STA (ADDR_DATA_TO),Y    ;写入最后一个字节
6 Y4 N: I6 G5 B' N% n
0 k9 K" B/ W: \/ [DATA_COPY_EXACT:    ;恢复数据2 J7 w( f6 t' d2 M
LDA INT_ADDR
! ]! r4 w7 ?5 X, O STA $2000    ;恢复中断
4 }9 q0 p8 L! g' d; j3 V PLA8 Z' i5 @4 {6 W% A$ D1 Y4 ]( b
STA ADDR_FROM_END+1
& C- c3 b( j1 ~, |) U) S" N PLA% E, H! t) Z! l3 d6 p
STA ADDR_FROM_END6 E" Z4 Q. _" H& F" L! v2 R
PLA6 G+ G4 m; I' ~, X5 {/ w
STA ADDR_FROM_START+1  e: n0 X' ?9 H( _6 A' N# d0 e
PLA
) B. c' N9 [! ]" y! G4 V STA ADDR_FROM_START, @5 D8 ]: O: n: N3 J9 M6 |3 |
PLA. V: t+ q- ^* h8 V2 F
STA ADDR_DATA_TO+1
: `+ O2 A  f, H4 ~3 m5 M PLA' P4 R8 }6 H' H
STA ADDR_DATA_TO
; g1 R: v9 j; z PLA
: H4 c; u9 [# k6 E# u TAY' a, M3 t+ k, {
PLA8 @) v, A) [; v- n  f8 D
TAX
0 w1 i5 `( F( S+ a! a( D PLA
5 ^0 o$ C% L9 }3 M' L' m/ Z PLP) Q' z3 D; @; @& l  l  V+ l
: r% v: E  {9 w. A( u% ~' i

: D0 k! t. B( }5 {/ T 5 C3 L+ j2 m6 R1 n, |1 t# j
DATA_COPY_RETURN:. L2 ^8 [6 [7 a  B
RTS
5 `, R5 ~0 Y% p
# S1 s) U1 F; a- m  e .ORG $C056    ;精灵指令覆盖% e+ o) i! Q( n6 y, }# t+ ]6 l8 ?
JSR $FFB5
3 ]8 o3 E0 }- y: O/ P" Y7 n
3 B; p3 P$ _: _! K8 ]" C .ORG $FFB5    ;' A1 Y7 G$ I2 {7 G) m3 Y
PHA5 x: [" N1 v/ J9 p+ J2 f
  TXA
& G6 B4 W4 Z+ _ PHA
- e- U+ z, w2 _1 ~+ b TYA
, c% B3 u+ e+ y; p7 r; j PHA
: \5 w' b" w- ^+ U4 k8 ~3 W5 | LDA $71FF    ;比较7000-71FE数据是否完成复制7 L: y/ [/ Q  }2 B
CMP #$FE
4 c& }! S/ u6 Q& t BNE ADDR_FFCA& w8 U5 a0 M' n1 s9 E
PLA
: d1 m1 ?" u9 Y! l TAY
" Y9 Z9 ]0 R5 ~% C/ `* p PLA& W+ G! k: Q7 z$ u
TAX( T5 X! |6 Z0 O( i
PLA% @1 |/ s. X  H& ]0 D: y+ }
JSR $7000   ;跳转到自写程序
$ s7 S9 @' K3 U+ D+ s RTS. o- G9 e* L1 ]3 }2 h' X
ADDR_FFCA:/ n0 z) Q4 W+ J3 `; W$ U1 _
PLA0 }9 D3 H/ O3 N8 H
TAY" Q) e* U* S7 x. }! U
PLA
3 T( {# k& ]+ ?/ b. k' k TAX
  z4 L2 l4 r/ x! U3 q# C% O PLA
, d( w( I. j6 e/ c1 B% M RTS; g5 b2 K7 y# c" a
( D0 r, I1 T+ q; Y* N# r3 _
+ f0 f- a/ `6 x
! Q$ q3 V" B" S! w! T& K
.ORG $C264    ;自定义的MAPPER2切页程序
1 h* q3 g! ?3 C! X  A; s PHA% O7 i& C' H' F2 {, r
TXA
( c$ L. a/ P- y8 z. j) ? PHA; d; i9 U6 G+ ~9 x: k1 @* q
LDA $0066
9 H3 t# G1 c* a BNE ADDRC2800 P1 x( A. V$ I0 B2 C, s" b' X2 R
LDA #$07! y0 a' }3 }0 y6 S( \% p8 d; k3 C
LDX #$039 I. j1 n/ h1 o! U% g; @
JSR $CD9B    ;自带的切bank方法
! F6 ~" N: A9 @6 v9 D PLA
- o3 \5 c5 u1 E! V% k TAX2 ^, A1 g4 O: X  K  c; X/ o; K' a7 r
PLA, j4 ^' w3 B& R+ ]; k
JSR $8000) J$ b9 W, B4 K, f4 l3 P& K
LDA #$06
! C7 X* h4 N- z( ~+ l LDX #$037 S+ s0 T1 D1 }: W5 E, ]' }( ~/ B
JSR $CD9B    ;切回原该切得bank(可以不用)
0 G+ W3 V% b& K1 o8 t  O, t RTS
0 a- l. k, J5 w2 a) }+ R4 |; RADDRC280:; L) M6 B2 X6 U2 r$ j6 I! g0 [
PLA7 S' V3 g8 X- z9 y5 k0 [! _- f
TAX; s, d# l5 O) k" g
PLA
' B( b/ z$ h: H4 I4 `# Y; S RTS
$ Q: [. o5 h! `& E5 Y 2 y  a1 c9 `/ H( m

3 R- D8 X( [* \9 q6 j;[FC][最终任务PPU][END]
. L- p, l4 d9 \1 ]" j& w" L .ORG $C056    ;跳转到PPU重写程序2 h+ B+ v! u, R& G
JSR $70008 }+ N. j0 C1 I8 x* ?

0 Z. c4 o# r3 c7 V' e+ Q. B .ORG $CEBF+ {3 H+ Z1 N: G- X7 k
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
, Z2 m! a8 c; v2 v  
0 L8 P, s- `2 i) J7 v3 x" M# J$ s  .ORG $E460* o: z. L& V* P6 K* ?1 ^
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
; |- W4 b+ G1 p8 b9 V    }; r5 R) }; ]: A$ J  [  E
.ORG $71F0: M3 c9 j! U- e* x- b3 q4 ~; Z, G
STAGE_DATA_WRITE:
  o/ U$ A8 |. ?: v0 m  LDA $6010: I5 W9 K! c" ~1 ^0 J" W2 \, m
  STA $1E    ;关卡写入
7 X6 z0 M* W* C) J& H  LDA #$00
% v: ]7 g# j2 ~* G  RTS
$ \5 C' ?% W- a. d+ W2 f) s8 @ .ORG $71C0
) h. J5 }: r1 F; h  x3 RBULLET_DATA_WRITE:    ;副武器数据写入
5 e: W! K0 k* B5 ?- X6 B! {. N CPX #$0E
0 k7 R* F$ l  L/ e7 y  e# C! F* p BCS P2_BUL8 t5 V6 n$ w/ F8 N9 o8 B+ |
P1_BUL:+ }; z& R* y6 K8 [4 ?5 a
LDA $6004
- r& T, V) a: g8 f, }6 A8 T JSR $D7D0    ;P1副武器数据写入
+ Q' f& c& F" H9 T/ p2 E' X RTS
( B8 h$ d% t: b+ c2 ]P2_BUL:2 D% T6 F- ?) T
LDA $6005* C) @7 r+ S* g: x+ p( ]
JSR $D7D0    ;P2副武器数据写入; G0 p) Y) H0 C, j/ b. e! c
RTS: ]$ l+ k- P, X, E3 |

' a- G) a4 U# ^9 v
8 r; H; u' P- y" t: f" d6 s6 [2 v .ORG $7000
% c" N" i1 w$ T( k) G2 r  9 E  ~* K! F, o" {- _) ^7 \( k- V
STY $4014    ;补上覆盖的精灵写入指令
, f$ X% S! ~& c( F) m9 F: U5 t PHA# g& {& |  M3 n9 u* z
TXA" q  e& q7 N; q
PHA, H( x% m$ d( N9 z
TYA8 ?/ P8 S' g9 o2 r) x: b6 W
PHA
5 f$ R5 r+ I3 { LDA $0C
- }. Z# N$ w! ] CMP #$01    ;比较是否为标题画面
. J& i0 p+ \" R% ~ BEQ PPU_STAGE7 e4 Z& d" S  p' C- @1 b
PLA
( @( `& L7 y- R# ^# q TAY
8 f* Q2 x/ B+ F# V6 I- F PLA+ T9 m, X+ o4 s: T+ a% `8 ^, O9 D
TAX
# q2 X9 A' U1 W, v PLA0 H7 i$ e, z* P9 O; Q5 v% d
RTS
" P- s- N5 f0 O/ o" c/ Q% J* P1 N( QPPU_STAGE:    ;STAGE显示程序
6 b* t& n; X( R9 ~ LDA PPU_ADDR_DATA& `  A" I0 T; _! L% j
STA $2006
9 q: ^4 w/ q3 G LDA PPU_ADDR_DATA+1# x6 j) L7 |3 n
STA $2006    ;坐标设置
+ M2 D* Z/ z4 [0 |' `4 c/ j LDX #$003 X" S8 P" g0 _  u
PPU_STAGE_WROTE:    ;写入STAGE字模& u  Q7 i/ S6 ?/ H
LDA STAGE_DATA,X1 B; p0 B/ Q  r# Y. j7 q4 P
STA $2007
* Q% a) X& z$ [2 v6 P& B" r# K- k9 B/ M0 S INX2 J) n) f7 C* }8 `2 W& q4 u3 N1 S8 L5 p
CPX #$06
. {) Q9 F9 h+ h2 r4 }$ y/ K BCC PPU_STAGE_WROTE
: z6 ^' D. r0 @* f LDA $6010, }1 |4 u1 y' {8 C
CMP #$FF    ;关卡数据初始化条件判断3 h2 e8 |. [/ n% |! s# g3 G
BNE KEY_B
8 T( t& v; Y+ E# g7 |$ F2 `+ { LDA #$00  v0 F8 P+ f0 ?; f! c% P8 y
STA $6010    ;关卡数据初始化
* i% ]& m* Q9 [2 y$ sKEY_B:    ;关卡减少" M7 [( }& j7 |  {8 m
LDA $04. P- _1 ^7 F! Z( u- P
AND #$42    ;按键B或左减关7 L; A; V7 [6 ~7 s; T1 i
BEQ KEY_A" k& H+ d4 v7 X6 |' e
LDA $6010
! r, d2 T. C8 W: D/ d) {1 _& j- D' O& M CMP #$00    ;关卡比较8 g* h- O' H5 ]/ m" _2 ?1 }
BEQ KEY_A
. m( X0 \8 A; F1 Z% b5 k' F9 n  C DEC $6010   ;减关
% \' v% q# a3 @4 Q% ~KEY_A:    ;关卡增加
( W' F! @! K2 v9 r$ O LDA $043 A" p* n+ O" f0 x
AND #$81    ;按键A或右加关% r3 o+ I# ]8 L
BEQ PPU_NUM_WRITE
0 d/ i1 K7 b: m7 ]: ~2 ~1 T LDA $6010& ^+ ?! ?( Y3 z# p/ r% U9 H
CMP #$04    ;关卡比较1 ?& ]  D9 C2 H* ~! N4 n1 M' y0 M
BEQ PPU_NUM_WRITE
( O/ n, _) s# n& ~! u INC $6010    ;加关
, ~0 z0 c  |. U, pPPU_NUM_WRITE:5 y1 h+ m$ j' B" B( U2 L. x2 C* u1 O
LDA $6010( }" `& O3 t9 ?- x! C+ S. D
TAX' J& [- Q) q# t' f+ N/ k( j
LDA STAGE_NUM,X    ;写入数字
. u3 t9 d# l2 x9 Z STA $2007
5 Y, W" ?" {3 SPPU_RTS:0 q- G5 ^0 h  a- [2 V
PLA6 |4 `9 N1 _+ l/ n
TAY8 I9 v6 Y$ }1 R
PLA; p6 b. c' o- j' ]$ K
TAX
7 t" |* v# O$ \ PLA4 L8 b0 t; @7 X) z/ m
RTS
6 U5 v' T3 V4 Q2 Q6 P5 I2 G 9 [2 W. h* F; Y. ?. ~

* C8 T( d8 o/ M5 {* k6 i# U$ }$ OSTAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据1 G, C; ]- y3 s7 X
.BYTE $EC,$ED,$DA,$E0,$DE,00+ n- o" m( k; ^: b1 C% m
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
; F, K; z5 J6 l  C$ B .BYTE $D1,$D2,$D3,$D4,$D56 _) v: @3 j# u3 Z

  ?  q0 ]0 J6 H- ?; z. lPPU_ADDR_DATA:4 Y* N. N( s& K- B' \
.BYTE $23,$0C8 X/ R# R5 z" C* K! `' U, }% s
, z* X* W" f! h% R

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2025-1-21 11:59 , Processed in 1.083984 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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