设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑   O) e; K  b5 y' p% p, K" ]% D

$ R  m* R4 K$ k2 X' `得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.5 D3 X* C9 [& r2 u
然而,今天想到一个思路.
! {7 f' v$ u, ~6 z( A$ a/ p! V1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.2 c$ Z& D* A! Z" h7 k. }
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE+ j/ q, h% }0 b& Q; K$ R
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
* _( B( h8 x* f( t5 W6 G6 l; q" [+ \' L% I6 M

3 Y+ q; x4 M, J: p6 U9 f;[FC][最终任务KEY][END]
+ @) R! D5 m) i* r& X, l4 s# Tbutton = $04    ;单次按键
9 i  H9 P9 l8 Pflag = $6000    ;功能开关标志9 w5 P+ Y3 U/ P- z0 J8 A
pause = $000E   ;暂停地址
9 c9 X% e, Q. p
# a* p7 Q; K$ S' c& x .ORG $80009 U9 D. L2 I( Y2 f7 V% C$ w
LDY #$08    ;自带的按键程序% X4 p9 }2 P! Q( i4 @$ L
ADDR8002:9 r* K5 P9 j" F: K5 P
LDA $4016,X+ Y) Q+ t5 D; V2 O
LSR% X3 ^) c. s: F% C& G" b% @+ H
ROL $0021
6 B6 w, J# Z" k7 r0 M+ d LSR
4 x# s8 H4 w1 ? ROL $0029* t; ~% e: s+ i6 {' Y4 C2 m
DEY
9 |7 f9 W) c9 h3 b/ ` BNE $8002
/ D7 ?$ w" w; W: s1 m* M$ K0 V( ~ LDA $0021
/ K- M+ ?+ o( Z6 ]; S9 }1 ^ ORA $0029" o' ^, r  P3 W" X, G  [! \
STA $0021% P. s; d  k( {$ x3 v
LDA $00203 Q" }1 I: X( n& o; {
AND $0021
& G. L/ s( {  J: C, S STA $0020. n. Z7 a" a$ Q
LDA $06,X
0 ]1 U& {5 k* T: [ EOR $0020
& b" `4 V5 \- F) Z9 C- Z. J* D6 d AND $0020# R/ H2 \+ z: u7 O) h2 U
STA $04,X
, q1 h* L: [# I8 g# S1 X8 d% ? LDA $00202 Q  b& A/ F& C4 `) R
STA $06,X6 ~) n! H; _5 z1 n
JSR KEY_OPERATE$ k: ]) D7 a/ u9 I0 P3 p
JSR Function    ;功能调用
$ c/ A9 ?8 Z1 L) ?' T JSR Weapon    ;武器切换调用4 I0 {, Q) U% M7 {- k% I
JSR Power    ;威力调用" {4 z2 i, Q7 s* c  z
JSR BULLET_NUM    ;子弹数目: i3 h9 a" @: [1 @& z7 P) Q
JSR BULLET    ;副武器类型$ w( ~" h' `. d" b" P! B' J  x
RTS6 }! ~' {5 H7 @, L
. l9 t2 g% P- B) O" c3 O
, w3 B) j) t( o# f  M

  ]7 L+ V( q: u# h3 N .ORG $80506 o  z6 b$ G5 Q) J( q
Function:    ;功能5 Q( _9 u8 D0 ^' h$ a: n$ ~# M& g
WUDI:    ;无敌
1 B, m( K3 F9 V) p* X LDA $6000,X$ q/ L; u% B2 ~8 V5 V* d% G
AND #$08    ;开关判断
% @5 W- Y7 O8 @ BEQ LIFE6 V5 o# Q% l; x% _) {$ v+ N: m
LDA #$05. W! X  F. h% K/ g
STA $05DC,X    ;无敌锁定
) e) k. l2 R% G$ `9 Z0 A5 a  C& ULIFE:    ;生命* ^$ N. q: P+ [; |! ~6 v. T, M. ]
LDA $6000,X9 {  U1 W/ I! `+ `7 f9 U
AND #$04    ;开关判断# \8 I6 B3 G/ h; V. A
BEQ FUNRTS: g  o( F7 j+ k! W
LDA #$05/ a) _0 \: M& a/ i. L5 a* }  T, B1 H
STA $1C,X    ;生命赋值8 [" ~" }8 f8 j# _+ Q
FUNRTS:. u- B% m! H7 G% y* l0 @9 h. E1 ^
RTS& j0 M( Q% c; Y

9 E/ N9 g1 Z, t1 |4 cWeapon:    ;武器切换6 ~& c4 b, j! C; X
LDA pause    ;暂停状态判断' {( Y/ c  |- U- X& f6 E6 s: v
BNE WEARTS' j5 d- J  M# C4 g2 A* b
LDA $04,X( _( q* B) {. F/ G7 r9 L
CMP #$20    ;选择键判断9 `2 C! t9 X) S4 |5 W
BNE WEARTS
( E! X8 T5 S# _! @) h( s; d( Y LDA $12,X
5 P; p: s7 o9 i CMP #$03    ;武器值判断
/ L1 v* m2 D! S/ ]& R, i5 r BCC WEAINC7 @0 E5 }6 p, _
LDA #$FF
/ Q7 W3 R4 w, w. { STA $12,X    ;武器重置
; `3 q! ]0 J9 J8 Q$ XWEAINC:; r1 H# I( u! d7 j
INC $12,X    ;武器增加
2 q4 }; }7 A3 x  a4 C* a# t/ q 7 ?$ F; [3 j' N9 r# Y- Y0 [7 }
WEARTS:
% s& M- o. Y. I  Y4 c  l RTS
3 Y8 L, G( f! x2 r ) u+ Q& N8 Y1 d8 [
Power:    ;威力
* X) c0 i8 f1 A& c& Z& T LDA pause    ;暂停状态判断2 Z) j& h8 n5 n. H& c
BEQ SPERTS+ t8 N5 o/ ~9 `# L9 o: K* g
BUT_LEFT:8 r- M# G: p* e) i, ^; _2 u
LDA $04,X
: g) r- ]. Q! a3 ^8 F/ f0 { CMP #$02    ;左按键判断
0 D1 p; g' A( e# h6 V BNE BUT_RIGHT% t# ~  X7 _# v3 h7 P! G" A# r
LDA $88,X# s2 ~4 l/ A/ W' P# j4 j  I
CMP #$00    ;威力判断- d: O9 i) O* c6 h3 O& F
BEQ SPERTS
6 M7 k4 U9 T. k4 o2 h" DSPEDEC" l, h, \+ j( X! o/ P
LDA $88,X    ;读取武器值* }9 l, x8 y" K8 Z
SEC+ O# X' N  B0 L
SBC #$08( P6 s6 o' v" u8 O* {
STA $88,X    ;威力减小9 f5 {3 T/ j/ i, ]' h
BUT_RIGHT:1 ?$ U1 ~6 ~* t" F& c* I$ O. |! M
LDA $04,X3 p4 ^1 N8 ]4 W+ N
CMP #$01    ;右按键判断
! q6 u2 V/ Q9 {, G6 C* M/ H BNE SPERTS
3 {5 n" S5 k/ \; \3 v LDA $88,X
! j* M) _; ]  i CMP #$10    ;威力判断+ V/ g, ]5 S! ^7 B6 L
BEQ SPERTS; P/ l- [  G' d7 U* [
SPEINC:; D( ]/ H1 @8 G' H% ~; _4 g. E5 k
LDA $88,X    ;读取武器值2 C/ i/ e- v5 M7 ]0 p! _- u
CLC
" ~& b. i( T: p! [ ADC #$08
7 z8 i8 G. Q9 q& u, W  X) w STA $88,X    ;威力增大
$ q! e7 p1 J! V % Q: w  N2 R4 t4 K+ P! A! o
SPERTS:
. E9 R& w' k8 F" @9 |% O8 g3 d4 f RTS
1 x0 B  S  m% C
( l3 o: W. S7 {& B( ?BULLET_NUM:    ;子弹数目
, |, a5 ~% ~; `9 [" y LDA pause    ;暂停状态判断9 H! m( ?" @  S7 S  [, P
BEQ BULRTS
$ v* P( N$ [4 c CPX #$00    ;主机玩家判断& N/ B% j1 {0 i( |% ?3 r
BNE BULRTS( Q! Q& i2 E0 k+ k
LDA $04,X    ;主机玩家判断5 t$ E* I2 S: m# P8 t( z2 x
AND #$80    ;按键A比较. T5 X; [  V" y. s. A( z4 v7 }
BEQ BULRTS
4 h1 T' B) s3 N% d1 j1 o LDA $87    ;状态判断, m4 G/ ^/ T: V- x, V
BEQ BUL_2# }( E. i  s8 s
BUL_1:# h" }$ a. C8 n
LDA #$00
/ B- D5 n* ~, Y: q7 w9 k( ? STA $87    ;1发子弹
9 a& x7 n2 M6 n) N/ L6 q; k BEQ BULRTS3 t7 m: E/ a9 n
BUL_2:( [, M7 A; O* r
LDA #$012 q) T, U1 W' N
STA $87    ;2发子弹
0 X: \, P3 ]! m9 d1 M, o) { 3 k' A# v) B9 g. q
BULRTS:- g2 X, q+ R; t* ]; w; B0 c2 l
RTS
& u$ |  W+ f& u9 W: u% b; l ! Q. B" X. f  l4 c

9 q6 ?% T" Z9 Z9 n1 uBULLET:
* O' ]0 k: I7 \ LDA pause    ;判断暂停状态
. s5 l' \9 y$ F- b. h# z BEQ BULLETRTS' o" k2 j( l, `
LDA $04,X
3 ]' U! K8 h; P' r CMP #$40    ;按键B比较
' {; c; {" [/ G3 j& t3 E3 j; q BNE BULLETRTS9 j7 ]) i6 V. P8 h7 U9 R4 _
LDA $6002,X    ;读取副武器
- i# h6 k; O3 y3 ~ CMP #$03
' a% k6 f; J6 A& q% C BCC BULLETADD3 A3 L0 r; ?! R/ ~, T; w
LDA #$FF
! U3 ~. W) p- P" _7 v2 E STA $6002,X
3 e& k( Y" P$ y+ yBULLETADD:
* V) c! ?% q/ g& f0 w5 n INC $6002,X/ f& Q) I6 e* m  C- k7 S6 D
7 {* _  R$ K  Q- V9 z0 g
BULLETRTS:
: E9 ^9 ~- v4 U8 k3 Y LDA $6002,X
* q4 N) f* l( t: ?' ^2 t TAY4 J/ ]/ d6 i) r) G0 A9 `
LDA BULLET_DATA,Y: e5 }7 ]! A; r# n5 D0 ?
STA $6004,X    ;写入副武器数据
/ W" u0 u( P* U$ n RTS- q( T- Y/ s, u3 l. d2 v8 b

& s- l3 a- B. X0 y/ _- M8 y- Z/ H
# t% D5 b* d  J' L3 M# bBULLET_DATA:
0 i/ h6 t, _# [% J: p7 u$ {  x .BYTE $06,$02,$03,$04- R6 o: D( F# X) I

7 m: \4 j, K; H ( i$ c& V7 B% {6 F  H: U, X+ M' F3 U
1 R1 U' O9 k' i% u$ O, F( B
KEY_OPERATE:    ;按键开关操作
+ ^; G3 e8 j' S: A( [data_protect:    ;数据保护) Z2 Q# I2 |, Y' w
PHA
: q) D. ~" x2 I8 e" | TXA  m5 i. `/ \; e$ |
PHA4 D0 G7 l3 W; z* w5 X/ [: ?
TYA
# ~9 F8 \! d% c7 [4 k/ I PHA+ [+ y) p3 v! h& @, r

& J" h  j$ v: ]# R+ x5 `  Y3 r5 Y6 F  fFLAG_INI:    ;开关标志初始化# o3 G$ z! W3 J- R' @; r# A5 [

5 E8 v' s6 U% L0 ~, i) ? LDA $600F
* ]: p  a+ W1 h/ }% T/ H6 x CMP #$01
7 J. Z4 y  B" E* V5 A4 c BEQ pause_cmp
, p* g5 G* y2 \1 v1 ~# F* K3 q4 L7 ? LDA #$00
, W" D8 y6 A" V+ F! g' S STA $6000
/ y9 v* G, a+ W# }' ]) l STA $6001
8 W$ E5 x& P0 z. k* y3 c* z, y STA $6002
( k6 t6 I' q% [& I1 x5 _0 K' q3 p7 Z% w STA $60037 S) m9 h3 ?  i
STA $6004& m* Y4 L( w$ ~- o  l' p! Y( u' n; a
STA $6005' N  ?) u" t9 ^$ l3 `, i
LDA #$01
# B4 |' O, v$ O STA $600F0 p2 T) h, c/ F& e

+ E7 G2 _7 B5 I$ Hpause_cmp:    ;判断暂停状态* Z* {6 J  s) B! B4 ~
LDA pause: K1 s7 y- ~  ]2 K
CMP #$01    ;判断暂停状态
. k) G3 c% m6 P% f# F* d: ~; k BEQ button_press
* m- k6 e3 P  @, x/ l' g5 O9 U PLA
1 q1 z5 A" _% f4 V& l! o' T TAY  `5 t+ J: k1 x. I& C0 U
PLA6 i5 J- R/ h% [( r# Y, ?, _; D
TAX
: `3 H& m* }' t. X% d: ^  T2 E PLA
4 ~* e3 k( J9 B) E3 T  @1 q RTS
# L7 y7 B& {7 |$ X4 t: n0 v3 M+ I; P/ X4 J( K: m! t; _) g
button_press:    ;按压操作
9 {; j, R! R% N& I' K9 n: Mini_Y:' j4 p1 r" z' {9 n" Y6 l2 Z- K
LDY #$00
' ?2 L8 w8 L$ w9 Z4 [8 G) r& nbutton_cmp:0 ?, `+ E0 w7 w5 I: R. e3 F3 A
LDA button,X
3 m. i4 U- j! ?+ [, l$ C, F+ B- P/ J CMP ora_data,Y
0 v2 `/ f' I! u BNE count_Y_cmp
8 N* }8 c1 n! X! \3 ]) ]4 T! i5 Pflag_cmp:
; W, M2 U& V8 n; M) M0 _, V' P8 \ LDA flag,X
3 v7 f3 H* G5 ^+ b% B AND ora_data,Y7 y4 y* t3 N+ i9 {# U' ~5 {  h
BNE flag_and( r! V2 ^' D& f" Q
flag_ora:6 Q. v' m! i/ g7 k( q' e5 `- B. l8 |: U
LDA flag,X5 j/ F* O+ L9 q: w- F8 {3 Z) I& N
ORA ora_data,Y+ G7 G3 ^( \% s8 z$ A2 P0 o( ~
STA flag,X' I7 X& Y) u  \" h% _5 f
BNE count_Y_cmp
7 G0 k) l$ X3 W0 }0 }3 Zflag_and:7 d, l3 o" U- m; k) ]
LDA flag,X
' K* V, y; ^5 E; i- f) ~ AND and_data,Y$ Q6 E5 H  F1 o" h0 u: a
STA flag,X/ s5 t3 j5 ?, j% b
count_Y_cmp:; r; @6 F. {+ d0 s  X& S- n! q# _) |# [
INY
# Y0 H2 m) K, K) s. ? CPY #$08
7 w4 J  ~' D' A BCC button_cmp- n- j5 U3 r2 Z) L6 L; x' y
" n, M. E! q" B$ D/ S! i2 ]; z1 v
data_extract:    ;数据恢复
! S( R7 N" T9 F PLA* T0 a3 y. c" t8 r1 Y
TAY1 q* h# K4 d7 x
PLA/ m% [& ~4 F8 ]  S  O8 k
TAX1 c0 x# F$ s! Z: e$ H% U' R
PLA% X* x+ v: B+ K1 c0 O3 |1 @
. K  ^' j8 s0 B, ]# a
return:$ _3 m, N# F& h; N. }# i
RTS% G) m1 Y) I( t- M/ Q
2 d! w$ ?9 y3 B2 R5 X( C- _
ora_data:   ;按键相或数据8 ?) n6 W" H% N
.BYTE $08,$04,$02,$01,$80,$40,$20,$10& t1 {, I3 f5 i4 G7 e$ \! E1 N' j
and_data:   ;按键相与数据  G" n; t! P0 c0 C% v, h
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
2 W& k( k6 q+ E: [: @( _- ~+ m$ R " D1 r- l1 b9 v

% X( T$ q& S$ ?( V5 E ; S- Y8 h4 A0 f$ R: L" j& U
;FC数据搬移程序 BY FlameCyclone
9 \) S7 v. _! x3 Y4 G .ORG $8200
1 o+ @9 c4 D: v) C6 E JMP DATA_COPY_PROTECT" z: x! X" c0 q* a

, g+ j) }  V" a( w+ u( p. z4 aADDR_DATA_TO = $40    ;目的地址6 Z" Y7 {# r+ w8 I2 F# i& g- o8 ^
ADDR_FROM_START = $42    ;源开始地址
+ L8 M9 T& V; Z" l1 B0 yADDR_FROM_END = $44    ;源结束地址
( D. l: t$ k0 I0 v
3 o; g+ y- b% E# `$ D. [. qADDR_TO:    ;目的地址
5 c" f+ t! |" Q3 }. P .BYTE $00,$70
" V; s2 M, k, T) c% X1 I+ m' s' ]ADDR_BEGIN:    ;源开始地址
7 [' Z1 p. e2 u7 f1 Q9 T6 A* a' k. e3 F .BYTE $00,$83
7 _' P/ `& U( p$ P' \6 T" PADDR_END:    ;源结束地址
" E3 D; {: b& b& U) G .BYTE $FE,$84
3 w6 c# {/ @' T$ ?; @! C+ a, r! y' j$ M# V/ c) _' ?
INT_ADDR = $08    ;中断地址8 g' n, E4 Q  c8 R1 q+ l5 g
FLAG_OVER = $71FF    ;完成标志
9 b! s; @2 N8 S& u. F1 S, I3 Q% R% X0 L! u
$ h" B$ N  X# o4 \
DATA_COPY_PROTECT:    ;保护数据6 F. K6 B+ W& g! T# ?  l2 S4 d
PHP
; w& \8 e+ _0 X8 ]; J  J PHA% \; R# L, [% k% o4 R9 ?- k" I
TXA  e7 @' ^* g/ r' K4 m
PHA
" z9 O# [2 @& o7 B7 d  b7 k TYA
7 g. Q  G8 e0 ~4 r/ z6 E PHA/ N- y5 f6 `( j4 _- w4 Y
LDA ADDR_DATA_TO
: ~. Z' D+ f, {9 G5 L/ K, o PHA
, E$ ?0 e- ?7 ^ LDA ADDR_DATA_TO+15 [0 c5 L- C, K2 K
PHA7 ~0 f. ]6 W$ N2 }: J2 s8 q
LDA ADDR_FROM_START
; V' b5 u1 u: \! v6 v! | PHA; p/ W" A8 ^3 U) f8 C9 @
LDA ADDR_FROM_START+12 }9 z0 f' @! s  p9 M, K2 h5 h
PHA1 m7 R  \$ x& X" }) f5 D1 L+ F
LDA ADDR_FROM_END
- M7 O. n1 w/ ? PHA
5 g- ?: q8 X$ P" a LDA ADDR_FROM_END+1" I! e1 l3 [- z5 I$ T3 q  d
PHA" O2 R# @$ E8 C, k8 |3 p) J
- k5 l& ?7 X& B3 d! E
OFF_INT:   ;屏蔽中断
* L* G1 f3 d* }# l; H1 |9 J LDA INT_ADDR& K. F9 F+ g5 @
AND #$7F6 k+ l% `* o* m4 Q  ~  h
STA $2000    ;屏蔽中断
, F3 \1 [' y% {+ d: G' D5 p9 W2 ~8 {7 _9 V

7 m) o& D# l& Z- q9 M. K( W6 ]SET_DATA_ADDR_START:    ;设置复制起始地址/ \& T5 [: z* ?% o: w+ I3 }
LDA ADDR_BEGIN1 z- s- |/ \8 p" i3 Y+ {; _% L6 q
STA ADDR_FROM_START    ;设置复制起始地址低位) R8 t: g- |2 |; v6 h$ x3 O& P
LDA ADDR_BEGIN+14 U" @% d1 o; x6 T8 e
STA ADDR_FROM_START+1    ;设置复制起始地址高位" h0 [9 i, H' ^, |3 H5 F7 L- P
" M: a. a% X0 M+ W) ?! R
SET_DATA_ADDR_END:    ;设置复制结束地址
# S8 y. q6 |) I, g LDA ADDR_END+ X, }4 {8 i. P5 l
STA ADDR_FROM_END    ;设置复制结束地址低位, d$ z$ q/ h+ _& c' Q
LDA ADDR_END+1
% X6 M# G; C+ T- q& s/ z/ Z6 x4 S5 F STA ADDR_FROM_END+1    ;设置复制结束地址高位
" F1 a  J5 A4 \: ^5 q
; ^; l+ j" S( ~  O+ M# fSET_DATA_COPY_START:   ;设置目的起始地址0 u- l+ f- L4 I9 r5 B: f
LDA ADDR_TO
* l' l$ ~9 J% z* q% @8 s STA ADDR_DATA_TO   ;设置目的起始地址低位! E3 U9 C- [- c. Z. X' _& L
LDA ADDR_TO+1  T) F' x! l0 x* v8 I3 B0 I( A
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
  e, W! v3 n( v0 k; p5 c, T
" I: k5 D: F+ x0 D# pOVER_COPY_CMP:    ;复制完成比较2 z# y& i# _! A/ @' H' N' ]
LDA FLAG_OVER% K/ l% F$ L" e, L: ?- d
CMP #$FE    ;复制完成标志比较- Q& I; w! w* Z, P+ w
BEQ DATA_COPY_EXACT
+ q6 C& i" D1 Z$ B
( o) V2 {- O2 tINI_XY_COUNT:   ;计数器初始化" x! a( B+ c& r* N
LDX #$003 B+ |5 N: L* P
LDY #$00
( k# D7 O7 Q) k$ U$ s * e* I( p. G# b
COPY_OVER_CMP:    ;地址比较
# C3 H7 w2 ^8 s" R. m LDA ADDR_FROM_START
$ ^9 {1 h# \- E+ _8 K8 P$ F CMP ADDR_FROM_END
$ x, e5 A* u" a. ~$ u1 q) ?8 c BNE COPY_START" T  |5 G: o! R% L5 c, a# [; H2 H
LDA ADDR_FROM_START+1
! q/ K/ `& H1 D CMP ADDR_FROM_END+12 V+ C; T3 K+ i+ m+ u% I
BEQ COPY_OVER* f) K3 r. X' q5 Z* R% |

$ W% K" ?- _" Y# k* R1 Y0 hCOPY_START:    ;数据复制开始
! y3 Q; X; a4 G0 h LDA (ADDR_FROM_START),Y    ;读取源地址
8 s  H+ o8 y2 T7 f9 g1 C7 u STA (ADDR_DATA_TO),Y    ;写入目的地址; D& Z, s0 H9 W; g$ L
INC ADDR_FROM_START   ;源地址低位递增
2 H8 |, N! F0 E3 B) @ INC ADDR_DATA_TO   ;目的地址低位递增
. ~/ D( B/ i0 I: Q- | BNE COPY_JMP
8 F% C1 S, _+ B* z- I INC ADDR_FROM_START+1   ;源地址高位递增1 ~1 A1 C8 O& R' g; l+ n
INC ADDR_DATA_TO+1   ;目的地址高位递增
# z$ r; ^4 {3 X2 a+ o) N + \, ~- F1 X$ d
COPY_JMP:    8 B9 R! p0 p' A  @; H
JMP COPY_OVER_CMP
. _3 C" H. j! M4 @& K- Y+ V: e: r) L8 f* R3 M
COPY_OVER:    ;复制完成
( [; i, q% J6 h6 Y7 U4 ^/ P LDA #$FE
/ a+ y+ B3 ^: [3 N/ ?2 | STA FLAG_OVER    ;写入完成标志; F/ O( e) C; U% _& ]
FINAL_BYTE:
- o; z0 t+ V4 }: D6 V LDA (ADDR_FROM_START),Y    ;读取最后一个字节+ |& k# s. j# x& G& q
STA (ADDR_DATA_TO),Y    ;写入最后一个字节
0 c3 H; _  K* z/ l! A + Z/ M: |' V: T/ y% g
DATA_COPY_EXACT:    ;恢复数据
% s. F: R, r6 s" `* W3 ~ LDA INT_ADDR
- t: b9 l; v% |& P/ \9 i" C8 D* J STA $2000    ;恢复中断
& t# F8 S+ P' O" }: T+ |1 u PLA( {. t. k* l# b, s9 L
STA ADDR_FROM_END+1
' ]2 Z1 R% s- p- w* m$ s PLA" k: R$ B, T2 g7 G4 n
STA ADDR_FROM_END
: W" \& M" g! l. G PLA
- i0 U1 ^6 L' @7 W! ? STA ADDR_FROM_START+10 P5 k6 c9 N% p
PLA0 A" ^  f8 V5 M5 G0 i( Z
STA ADDR_FROM_START/ J& j3 c) n5 A8 W: y; ]
PLA
' b" t3 Z, i$ h- P: }. g: |) X STA ADDR_DATA_TO+1+ V. Y7 w) t! J0 P
PLA/ E7 J1 ?5 V% D, G* o
STA ADDR_DATA_TO
3 V; b5 [; `1 E PLA
& R& K1 G2 s: ` TAY) q: h# _! c2 ~% L$ F9 p* d3 E
PLA
9 J1 v. ]+ J4 A7 j8 x TAX0 G9 X- b  }* h& u0 R# R
PLA
# v- I; w" R4 w PLP9 u- B7 l$ k& x1 }

$ N8 g8 r& v4 E% I * w5 i- h, A2 B: v# [. l
, C8 J3 ?* c4 a* d  U
DATA_COPY_RETURN:( s# X$ D9 r2 x
RTS. C5 f) v3 b% d1 k* q  k% S

) a: m0 V. ~9 `# n  t  D+ Q .ORG $C056    ;精灵指令覆盖
. S: [' u# W9 e  H: y0 [ JSR $FFB5
# A( M" E& n) I) ~3 B+ d7 s3 R' q 2 B* q: q7 _7 m5 Q' a
.ORG $FFB5    ;* r- W5 Q  M/ u  n) N; b
PHA
6 b, F9 @% y" h: D7 _6 L- Q  TXA7 R3 R4 U# t+ ^1 f8 z* x
PHA+ @  d& d$ A3 U, x9 h/ ^2 E% Y
TYA8 n+ U' ], N+ w$ w7 u* A0 g
PHA
7 I# H: t, B% v# d0 d3 P6 d LDA $71FF    ;比较7000-71FE数据是否完成复制) T+ ?. A% c3 [4 H" o4 W+ E
CMP #$FE& p- o4 ^2 q) R8 c% C! S
BNE ADDR_FFCA
2 I4 |" ~" F/ K" c- y PLA8 v* |7 ^# M9 y* s8 |6 d
TAY
5 V0 e' b; _6 J: n PLA
3 e* ]# Z0 i# E- O TAX$ c5 S6 s6 F% k& j
PLA, r8 [" v& |2 W" u
JSR $7000   ;跳转到自写程序
; R6 e3 \& Y5 _; B& C  P RTS( a5 [, A  z1 _, s7 C* {
ADDR_FFCA:. ~) @, U* }: w) T% t0 I
PLA
- x9 r$ R. A2 n* n$ L* Y) I9 o TAY) c4 r; t8 X4 V# E! i7 t: x1 b
PLA" |2 I, K* V& T8 D7 `
TAX
/ V5 l7 f/ d6 H* b1 e7 `% g PLA5 l. q5 B) a, |# Q
RTS
9 i# f/ W' C& S1 A' M2 u; Q; Z7 I/ r
* Q4 [/ _# |+ O5 y  }
" g; Q" A( a8 k+ w
.ORG $C264    ;自定义的MAPPER2切页程序8 b$ U! ]; O/ P
PHA
' `9 P/ p6 K7 V9 P TXA
9 x0 e" p8 R. d PHA
7 ~2 }8 V' H% s7 g( E7 E& r LDA $00665 [  p- @5 c, e' o* T
BNE ADDRC280
( ]$ Z& f  n1 O0 }4 q* X2 s LDA #$07
8 L$ [# D  @! {2 J5 F- Y LDX #$03
, Z0 e# D$ g5 E7 V! f7 ?5 ]% F  f JSR $CD9B    ;自带的切bank方法
$ i' P+ e* j9 M' l PLA3 x  a: r5 Y1 g
TAX
' A- Y1 I/ u" q: u- Q8 Z. l PLA
9 z, T% O0 F0 V6 s* x" D JSR $8000
- [1 D8 y# m8 H# E3 t% ?* e/ X4 L LDA #$06
* u2 I+ \" v) _  m$ Z LDX #$03* j, y# K( A0 f0 S# D5 D) l  i) H* s
JSR $CD9B    ;切回原该切得bank(可以不用)- G8 _% ^, x* j. Z
RTS- |8 ^, Z0 Z8 Q0 C
ADDRC280:
5 k. V! W. c9 Z PLA0 c' I% H. ~, f% T8 [! @( d
TAX7 c( |8 V9 Z5 q# j3 T
PLA( c! x4 k' N9 r7 {
RTS
( W/ f+ j9 C+ e4 v* ?
' X6 l* q% [  Z  v8 c  g/ c , P7 E9 z, g) t! g! B. l6 B
;[FC][最终任务PPU][END]
+ D; b% y  P. L .ORG $C056    ;跳转到PPU重写程序3 N8 B. }" J. s$ q) Q! j
JSR $70002 C: G6 N7 d1 E  ^
  c+ B6 j* v( B, ^) ~- G
.ORG $CEBF
$ R( [+ ^$ I4 U$ M; n$ v5 s JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
) a" U% P7 U0 l( m9 m* F  
% h7 U; s$ W, n0 g4 P" A1 F  .ORG $E4609 |6 C6 I* T# F. G4 \% \5 R
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入) v, }! v% W' b( x* A- v
  
! x! f! }5 v+ v- ]  Q5 W .ORG $71F0( J; @$ c1 d  E# z9 m  B
STAGE_DATA_WRITE:
* I! S8 r4 y1 ^8 n6 e  p  ^. J6 W  LDA $6010
8 t3 X) s5 d4 |: P5 p+ O% [  u  STA $1E    ;关卡写入
* C( V2 ~5 M* R  LDA #$00! Y5 h9 Y. D" i
  RTS. c6 x% S* w/ R' [- m! L
.ORG $71C06 V7 d0 \1 Y( l. z. {! `
BULLET_DATA_WRITE:    ;副武器数据写入% r$ u% D# k$ m. u: ]6 ?: r: R/ `" {
CPX #$0E, D7 U& i1 Z3 M& ]% t
BCS P2_BUL: i8 H/ O! Q' ~) h- n2 q' F8 e
P1_BUL:
3 U4 s. ^* }+ d+ j4 h. F% z! h7 n LDA $6004
  j; S- ]1 |/ y. B JSR $D7D0    ;P1副武器数据写入  x# I5 _2 N- h$ r$ [9 c
RTS% a8 r8 l2 `% X! H
P2_BUL:( c: ^. [3 N! `; h4 f/ k8 P
LDA $6005+ n% O0 C- Q  z% e8 _
JSR $D7D0    ;P2副武器数据写入
0 ^" ~* T. {; J2 M RTS8 x6 U: I( }3 j. F# V" l4 C) Y* c) Z

. K' |9 Y3 e$ ~! a. z3 s$ Q) u: o) ]' W7 K
.ORG $7000
+ [1 C! l$ c2 C5 J9 ^( y2 A- `  $ M4 r7 \6 x; v. Z. y0 l" o. d2 G7 l
STY $4014    ;补上覆盖的精灵写入指令2 Z, T% Y2 N$ c( k0 T
PHA
! A, D6 l- N4 w* [. z TXA
* H, X& T4 ?$ `2 J% `) m! l PHA- Z3 Y. z% M# {; O) T9 [
TYA: W& G! R& k% p# a% F
PHA
/ M' ?8 i$ w) U: @7 } LDA $0C
) C8 q/ O0 @5 K, V9 a CMP #$01    ;比较是否为标题画面
, [+ x0 b+ W5 X4 ^4 ]+ u2 g+ z9 @2 J BEQ PPU_STAGE
* K, y4 f0 Y  H' Q2 a8 Q PLA
$ [$ g9 f3 r: X& D0 \8 s! N. a TAY) W: i2 P5 [2 ?  P) S
PLA
) k/ ?+ O4 r+ h/ }" r6 Z TAX! \5 X! I. p$ {% g& v
PLA; U& g  s. i4 |0 N9 `
RTS
( q* s4 k  b& Y4 c+ |, gPPU_STAGE:    ;STAGE显示程序- o6 l- L! O, \& d. e+ _
LDA PPU_ADDR_DATA% o; ~5 W3 B  G8 G6 w
STA $2006% t, K  B  r( n  L6 o6 S
LDA PPU_ADDR_DATA+1: u! G$ [, U1 [- c( F: O
STA $2006    ;坐标设置
1 w" N3 B) x1 L% C LDX #$00
$ }$ w/ g7 [; q. I1 NPPU_STAGE_WROTE:    ;写入STAGE字模
4 A6 ^0 C  x$ h" D LDA STAGE_DATA,X
# G# `& Q0 T! @/ x+ w3 H STA $2007
1 t( G  F' i: q) t- E0 h6 j INX
8 L. w& q9 O0 c CPX #$06: x. _0 h3 x$ E% A+ a+ c) j/ ?6 T
BCC PPU_STAGE_WROTE* b! ?% p3 z+ Z$ p' w. F+ L8 O3 W
LDA $6010
( ]7 R4 n2 s: S9 M3 F CMP #$FF    ;关卡数据初始化条件判断
, K- r0 i0 R  M/ W& i BNE KEY_B
1 t% l) U, k, R! S- D2 v" _ LDA #$00
" U8 b3 ?- x9 \' v STA $6010    ;关卡数据初始化
0 L8 Z/ U. u6 D' ?$ e# U6 t* ^KEY_B:    ;关卡减少
& ]% h9 V: g1 s' K9 A LDA $04+ f% q- e. ]. g% ~6 c3 K, S$ N
AND #$42    ;按键B或左减关* w+ U8 M$ S5 {% C! \# N- B4 H; t7 y
BEQ KEY_A
$ e" |/ f% I& E. f, h LDA $60105 W3 D* d0 e% ?
CMP #$00    ;关卡比较+ S. S7 m) F/ W: w1 H+ r( z! @7 F
BEQ KEY_A! Z- L( B& h$ ]* z$ ]
DEC $6010   ;减关% J* x/ @8 {* e6 C8 v/ z* Y
KEY_A:    ;关卡增加
' r) I8 l# r6 @& g9 h LDA $04
; \$ F7 _: _  [& D AND #$81    ;按键A或右加关4 u+ P5 Y/ n  z$ g8 i
BEQ PPU_NUM_WRITE- M, Y& O8 s* f2 X) E( V
LDA $6010
. v6 S# X* i) V0 g& J CMP #$04    ;关卡比较* S' u% g, N) c
BEQ PPU_NUM_WRITE
9 a: q' |; w1 I( n3 b' U6 ] INC $6010    ;加关
1 T# c, q' Z8 W+ ^PPU_NUM_WRITE:
' {5 K0 \* b2 u& S LDA $6010
7 F: S2 F7 i# l. w0 K7 @, \ TAX
) E5 p8 m$ G5 {, }- Q) E* v( ~8 h LDA STAGE_NUM,X    ;写入数字( {' e$ X# i3 y1 n& n4 f
STA $20072 c% B3 L7 |1 V/ C+ V+ Q  b
PPU_RTS:' T; _- V# i9 k4 n& [4 L9 [) C: f
PLA2 {$ x. m; ^& w( |
TAY
( Y6 B2 b8 `! Q/ O* J9 z4 B PLA
5 U% M) J( r* _' j! N* b TAX; K) v0 Z$ ~% w/ o7 p7 O+ K, U
PLA* _. \3 d% O# e) e9 ?
RTS( k( V) W& [* X& S% B
% d% ^  f( P7 p% g. s9 q
* T. P. O6 ?' E$ F( P: w! k
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据
2 P3 |: R4 F& n1 h5 T" I+ m3 G; Q9 ?  O .BYTE $EC,$ED,$DA,$E0,$DE,001 C: f& a* r" t, B9 D
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
  d# |/ ]) U- w .BYTE $D1,$D2,$D3,$D4,$D5! w7 [7 N% O" G" L, \% y

7 n  G( \. U2 c0 _( w# ^8 Y+ DPPU_ADDR_DATA:
) B( z7 n. F5 [, b' G6 o, D7 J  Z .BYTE $23,$0C" B2 n2 v# U6 d- |

* N4 n/ T5 o( f: v+ s

本帖子中包含更多资源

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

×

签到天数: 179 天

[LV.7]常住居民III

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-7-16 15:06

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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