EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
  B5 Y) N4 M% h6 q; t6 R! w7 d0 w( y/ b/ d2 Y" i( X
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
% W6 R0 X( E2 \" C然而,今天想到一个思路.
7 `5 B$ Z1 X6 X5 ?, E1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
/ P1 F8 K+ I, I8 m7 e( [" T# n3 K2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
) l% ~  D/ n4 D+ _& I$ M( y/ F3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
- q" `' B6 {$ M/ G, H3 E0 ?8 g
' v+ a% k- F+ ?) w" Z# v9 \$ p1 X! b9 a# U
;[FC][最终任务KEY][END]
0 s. J- I5 Q$ h' z7 Z3 D" Nbutton = $04    ;单次按键
# I- I1 A2 r/ |; D4 y# vflag = $6000    ;功能开关标志7 w" t5 b$ ?7 `! \% I% U" ~
pause = $000E   ;暂停地址3 {8 B% L( \; w/ s# M
# D) ?& u- Q' o) y8 t8 @
.ORG $8000
: q' @) q2 @2 A# O: q5 Q LDY #$08    ;自带的按键程序
4 `5 C6 Y) E( l8 JADDR8002:" ?6 {; R7 B* H, q3 g# U  B! J
LDA $4016,X( T% Q* f  {) f0 y: |$ B% f' W
LSR+ {6 k0 U# S* f2 G
ROL $00218 z4 `- I1 q& j9 w, u; S. H& N
LSR
% l3 y" c$ v( F) W8 t/ r ROL $00297 u1 f1 k7 ]$ `) b  F
DEY2 j2 n0 U! U. z/ w7 M
BNE $8002
7 f/ A. k9 C1 b LDA $0021
3 H, t* S5 _' [" I3 X ORA $0029
" v  C* e1 O9 _% z STA $00213 q$ E* L- }# i
LDA $0020
! T1 z* @6 K3 L3 V AND $0021
! E4 |( X$ C5 _+ e STA $0020" L" _6 k  v# Q
LDA $06,X" e! R( y/ I- y: |' V; e8 u; ?8 x
EOR $0020& X, C: E7 M) ~- P8 ^
AND $0020
  G  T2 c* u; r! {  }( b STA $04,X
% A2 ^! Z# S" y) l, e' X. F2 p LDA $0020
$ K6 M# X* K( l3 }, y& T STA $06,X% ]5 R; C8 @7 P4 |
JSR KEY_OPERATE- [+ [. ?& p, S/ }1 y
JSR Function    ;功能调用; V# i' D- _& _$ x  M. _
JSR Weapon    ;武器切换调用3 T- Z+ A$ \3 \  \( A. `2 a
JSR Power    ;威力调用9 d6 w1 d- R+ m3 g
JSR BULLET_NUM    ;子弹数目
+ y! z0 y5 s1 s& b; k& Z  i JSR BULLET    ;副武器类型3 B7 B0 J6 ?" h9 G" h6 y4 l
RTS
0 n2 g/ X% {9 _
2 g+ B4 d' x$ H+ V# a  y( ] ! N) O: E8 I. F8 R) F" m

2 B% B9 |0 }& a1 x: `1 a/ D3 n .ORG $8050
# Y8 l- f( n1 _; GFunction:    ;功能
1 ?! X3 T# O3 W+ i  h' rWUDI:    ;无敌
+ |4 G2 T' h5 L LDA $6000,X" n1 V% k$ d4 V5 `& y5 a& g
AND #$08    ;开关判断* W& t, L/ i6 B! J( C: |! g
BEQ LIFE
: @0 t; e& e6 Y# H1 p" \4 Q LDA #$05
& B; M) J, m- M) F% `; S, f- E STA $05DC,X    ;无敌锁定
8 r! R( p3 w) Z! o. pLIFE:    ;生命( f& z! w% O2 G: @% o1 ~: O9 |
LDA $6000,X
% y& e3 P( K1 \: Q AND #$04    ;开关判断
6 Q* \. N$ r; t! A BEQ FUNRTS7 N& K' B* Z) {2 ^  B2 Z% O3 ^  m' R9 }
LDA #$05
7 M3 A/ x2 \, c( {  H3 ~% ?# @ STA $1C,X    ;生命赋值: t/ H) u" J. H+ X$ O6 F
FUNRTS:7 N" T: _' X6 O2 s- d
RTS
' D) ]# J; ]/ K1 Q$ n 4 b! a& R5 F+ ]+ z% ?8 E2 Y6 ?" M
Weapon:    ;武器切换
* e* t, A7 z6 j" | LDA pause    ;暂停状态判断; n: X+ C. E( \& S9 p
BNE WEARTS+ |- _+ d: c: ?: i' l
LDA $04,X
( ^' r4 l/ }6 h# n CMP #$20    ;选择键判断! {3 [2 J: G/ `$ G% e5 a- \& y
BNE WEARTS
1 v# h9 _8 \3 \- j3 j+ j2 f LDA $12,X: v9 Y( g- s& B/ W' C
CMP #$03    ;武器值判断
7 k1 o# f" y) L( ` BCC WEAINC5 v* Z1 b4 ~3 b0 F8 r0 T
LDA #$FF
& p# o/ U9 _9 N5 _ STA $12,X    ;武器重置; s5 [# ^4 _. a4 D+ b
WEAINC:" x6 z4 H3 I  N/ Q2 Z
INC $12,X    ;武器增加
. \. f" I5 |+ i
6 G. X; N5 F5 TWEARTS:
4 j' c/ Q' ~2 ?$ j- u5 L' Z% ~ RTS6 R6 h, T; @$ k3 E
/ `: c1 t. E) [" ]4 n0 S& f* D' K
Power:    ;威力% t, L) O+ D7 D6 c
LDA pause    ;暂停状态判断
: {; \: w+ b7 q# y7 D% ~ BEQ SPERTS8 P) q8 L% @/ F8 t9 p6 a; z
BUT_LEFT:
1 Z1 |  V2 T: h% P( _8 n LDA $04,X
" P& j: Y6 p, r2 H( E  p0 f1 R CMP #$02    ;左按键判断
) G+ f! b5 t1 b$ _* T( @ BNE BUT_RIGHT/ k/ n1 Z, H  |
LDA $88,X
7 t4 q$ v! s: s  {$ D CMP #$00    ;威力判断
, X, U- K$ i- L0 w: l BEQ SPERTS
: t2 m6 A- T) Y! LSPEDEC
* N' v2 O+ d; F( d! u LDA $88,X    ;读取武器值
6 a* n3 F7 n' ~8 ?' G1 X% j8 y% { SEC$ h2 F8 D1 \# N0 D
SBC #$08
( B- Q# n* U# l STA $88,X    ;威力减小
4 V4 b: w" j" I$ ]* P4 yBUT_RIGHT:
$ [& e9 L: l$ V4 d LDA $04,X, w" S# L- e5 U$ {; N! [" E! K: _
CMP #$01    ;右按键判断0 \: a$ M9 Y+ G6 _' u! [
BNE SPERTS
% Y3 |$ E! A$ _6 }/ Q6 L LDA $88,X
: V* R" V8 R( n2 D) Q; r CMP #$10    ;威力判断
: a) h/ U' @# k& V4 g+ \ BEQ SPERTS
$ E, p8 f* H& c. J. bSPEINC:
9 J& t" ?" `: \( ]8 f/ [ LDA $88,X    ;读取武器值8 A0 q( K4 _) u# s3 g( D' I
CLC
9 N6 p' o4 O. g( \ ADC #$08) m0 [+ c* j3 W, U% B
STA $88,X    ;威力增大, H9 ]' p: D2 D" B8 m8 {, ?5 Q; n
% v( O2 l) ?; N+ Y" L
SPERTS:2 F) u0 U6 j* B' w% r! B  n! B- x
RTS  O4 D: ?# a& Z; h; Y

: c4 U5 t: `+ X* L0 i) ~BULLET_NUM:    ;子弹数目0 P% Z, P1 f4 U# ?3 S" C% Q
LDA pause    ;暂停状态判断
: V, t* N; ~/ z0 e0 x BEQ BULRTS0 [1 @' B# Y. H7 x/ [+ b
CPX #$00    ;主机玩家判断9 |* S& C' k5 M  |( z
BNE BULRTS
$ t3 w8 o5 X4 h5 K$ d, b LDA $04,X    ;主机玩家判断; l0 U8 s! u2 e5 k- T5 w
AND #$80    ;按键A比较
1 Z$ a1 K4 s4 A3 N% K BEQ BULRTS. \. |) i4 j6 ~' g, D  z" s1 _2 z
LDA $87    ;状态判断
( M( x: R9 d3 n# g: K BEQ BUL_2
- w4 x  l" [) ]; z: t. ]BUL_1:
, c# I% E$ H/ G; R1 r+ d2 w LDA #$00! w6 N7 a% v' u2 Y8 ^: f! s0 Z5 X
STA $87    ;1发子弹. ]) s* h, G' Z; S: r, s
BEQ BULRTS
) ^8 b- A5 u& Q' j8 ?/ l4 f0 fBUL_2:& x% U: E% V2 K. l& i
LDA #$019 R2 Q9 _; G6 L& c8 W
STA $87    ;2发子弹
$ e+ x6 c1 Q9 T
. O3 J8 _  k) M+ k" t% W3 [5 Z* yBULRTS:  z) I, y# ]% C5 H: o8 b; v
RTS
3 P; x; Q+ Y/ z% C
! S) r1 R: @' p' w- N: ]( G' l6 }$ z: N/ O
BULLET:
9 b3 u% m3 y' n LDA pause    ;判断暂停状态
) I- t/ g! ~4 F; D: x/ H  p BEQ BULLETRTS
) R0 g2 X6 Q/ _. J LDA $04,X; V: L! I$ g8 C7 \9 d* g& a
CMP #$40    ;按键B比较  Z6 q& s' [6 E
BNE BULLETRTS
" q% U0 O/ F+ t) D LDA $6002,X    ;读取副武器  F0 g3 @( g4 L* \& D
CMP #$034 d/ J( P9 w- U) _0 r: D: S
BCC BULLETADD
+ l/ f. N& R" ~2 g. ], Q# j! v LDA #$FF
8 D9 W; S7 N' ^8 k STA $6002,X! b  Y7 S* I  P
BULLETADD:
6 R7 o5 V( ~0 X- P2 u1 N! K INC $6002,X1 t- I/ S# K0 p9 Q# v
9 i7 s0 j; x5 A' p
BULLETRTS:
6 m( I' Z. N3 V. h LDA $6002,X
2 j) q1 ?4 g8 P TAY
# m, ?5 X: T# D" B0 h7 J( q8 V LDA BULLET_DATA,Y+ }% M2 [; C2 y- P- X
STA $6004,X    ;写入副武器数据. s" B' W9 I+ x3 `& |; a( m( p" e
RTS- B) d3 X% G/ E7 I; g

3 L( [, b0 u( D9 D% ~( h5 u2 w ! r( K/ Q0 Y( s: ~& _9 y
BULLET_DATA:" L9 u2 y( N& i
.BYTE $06,$02,$03,$04
% ?: a) i5 @/ [2 S. s4 A
  h" X( g8 j  P7 O+ }' g* o4 C
& c4 ?& A* n# A/ [
* z0 J- q4 j, j7 UKEY_OPERATE:    ;按键开关操作
* D" S+ y" B$ Xdata_protect:    ;数据保护* B; U2 W7 O; B% P. M
PHA+ {/ E. J# _* L8 Z7 ?' u2 z0 k
TXA0 ]# k& W* N# m. ^& t
PHA8 i1 c4 ]" t$ ]% ?1 K1 ~
TYA; ~) @2 J  s" A  \, ^
PHA0 q5 @6 F3 p- T4 P9 |$ H; n

6 e- w4 p0 b- t0 PFLAG_INI:    ;开关标志初始化
, Z3 y  R3 p9 J2 Q( X4 C, a' K  c: o& T
LDA $600F
- n8 N4 z2 O, N+ A7 E CMP #$01
8 R* [% I, t3 y( f BEQ pause_cmp
; U, q$ W& M6 w LDA #$00
9 a# |" a8 |3 ^# P! G+ c/ R# W STA $6000* o5 T0 Y0 A. J8 v  K/ M6 Y$ ?
STA $6001
% P% n( }7 T# R: {  c STA $6002  v, S$ E: F* c7 _+ v$ N9 B+ ^
STA $6003* d' r% v* K$ ]0 k3 Q
STA $6004
7 v/ ^+ g: A2 H STA $6005+ L; Q" E1 ?1 }' @( Q, m7 r
LDA #$01
  u. `8 I+ Z0 r1 U& @% S STA $600F8 I0 ?, F1 [4 ^8 P; X3 G9 h7 H& |

1 V) t& V$ ~  s. T3 Q) a1 _) _pause_cmp:    ;判断暂停状态0 I& Q$ C. c: p) K
LDA pause8 W7 z3 z% Y  Y- @) w5 _
CMP #$01    ;判断暂停状态- E+ @' \+ ?! S
BEQ button_press# z% l" C' ^5 o: M
PLA
5 e" m) S6 W$ z% O8 L. x' s& j: Q TAY
) z  n1 }! {  H# C( _& o PLA: E  q2 x4 E6 x6 b/ s
TAX
; m" w* F: W( P1 \ PLA
" A5 B) z- v: p4 D# C' H2 U( D RTS' V" c" t9 m3 V

$ b7 Y" f$ l. o+ f; qbutton_press:    ;按压操作( c" d* j! K, O: R0 j: F
ini_Y:
% X7 S8 H8 H7 }5 n2 @8 ~ LDY #$00' [# n5 A& ^' R
button_cmp:' R+ m; t; J8 O5 b3 @8 h# c( A
LDA button,X0 R9 V# G: R9 B6 t: h4 ~
CMP ora_data,Y1 i; X/ A) v7 o5 ~$ Z; F
BNE count_Y_cmp
2 }" F4 W: L: W$ S; s0 y6 F. Uflag_cmp:
" h, C0 }* W3 l* V- q6 w, ` LDA flag,X
' |3 X- i" {3 R AND ora_data,Y0 b0 a+ V* C7 A  x0 U2 n1 Y; j
BNE flag_and6 z* S3 a2 y9 g) q. _* p& |
flag_ora:) l' J+ l9 S  c$ Q6 w( [
LDA flag,X
! D3 E( U* M  o* u; b0 R" q' |( E ORA ora_data,Y
( Q4 i: b5 k0 f& v& ?1 A STA flag,X) j* ]9 f1 i- x
BNE count_Y_cmp
- f/ d6 ?* b) |* p6 vflag_and:1 Q8 P' b/ `$ X1 T
LDA flag,X# N4 H4 l4 r6 R4 ~# n8 q5 b
AND and_data,Y
- p; A, r, S7 ?9 s; p  C STA flag,X4 ]6 h2 J  @* _, e+ s
count_Y_cmp:  L. u2 m7 j1 c% ~' n
INY$ c  p# `( f4 Y; j2 M
CPY #$08
; ?$ V4 \2 u; E9 e6 n BCC button_cmp$ p: D9 a5 `+ i" H# |  n+ W6 {  p
0 t$ }, o: o8 i, W2 q
data_extract:    ;数据恢复1 M( ~5 s+ t# i4 L4 I- W
PLA
  m# X7 V: F$ t4 }* t7 m TAY" z. [! T4 |& R) s) D# h
PLA3 ^% K$ [/ y, Y
TAX5 M6 b6 [* `7 y& ^: s' b
PLA
, A9 h$ |$ L  Q+ X1 Q % y) Q; G/ F" g. ^# ?
return:
, |# }8 o* b3 W. A' Q* r: O RTS
' K; o% w1 I8 J % a7 y# N6 J  R2 M2 H
ora_data:   ;按键相或数据) \% I/ Z) J7 a8 j- L
.BYTE $08,$04,$02,$01,$80,$40,$20,$102 q$ M) _, ]5 [0 }
and_data:   ;按键相与数据
4 l/ r* p! F0 A" |  U! k- X( z  i* { .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF3 k3 L' q5 O/ o7 u" I. n2 v7 d
- E2 T! H: Q' g% n8 D
6 w8 S& w& `% _# W

; p  \- X; u% W ;FC数据搬移程序 BY FlameCyclone7 t. }" I6 V  y# T2 X. V4 I* |  f# M
.ORG $8200/ n2 Z' W- N+ E$ V
JMP DATA_COPY_PROTECT2 b2 i9 W' E$ r" q6 x
+ ?1 w3 k3 @% [4 W& E% h% n- v9 k
ADDR_DATA_TO = $40    ;目的地址
$ J  q/ I( H/ t5 h: f; xADDR_FROM_START = $42    ;源开始地址) ]+ j1 j) R2 v) z* b3 J7 u+ O
ADDR_FROM_END = $44    ;源结束地址
2 ~8 j# ^' \2 M! I! {
: {) c; [: B: u( GADDR_TO:    ;目的地址
5 ]/ l/ k+ ?- _! @) W& B* L* G .BYTE $00,$708 K3 z2 c, [, Y8 |
ADDR_BEGIN:    ;源开始地址
1 y, X7 i% j0 @- k3 b .BYTE $00,$83" n) y; Y8 U0 @( x6 K7 C' x# r
ADDR_END:    ;源结束地址- u6 P2 O% E% b! S( F
.BYTE $FE,$848 A# ]) k$ y; y9 }3 n  J1 Z

& ?0 _; H4 q2 VINT_ADDR = $08    ;中断地址% v+ n' ?. o; I2 B4 v
FLAG_OVER = $71FF    ;完成标志* X. _0 p* _$ w$ c1 v- r

( {) i/ C, r. P' k2 R4 M# _0 _" J# H
DATA_COPY_PROTECT:    ;保护数据
/ T+ k* A/ H9 ]# ?' N6 R6 J8 p" f PHP
  N/ C. A# B6 h- c3 _ PHA9 A, ~: ]% b6 y  ~! @5 T
TXA) Q+ d7 W" [  I& e
PHA
0 k, v( ^2 W6 \7 v+ P7 [  E TYA  O" w% D* L8 j
PHA& R6 E4 g' w, q- F# g
LDA ADDR_DATA_TO
/ \8 k) H% v  S) P# t6 ]; s PHA
' X$ ^5 ~1 i3 D; }6 u LDA ADDR_DATA_TO+15 i# B6 Y+ _, _0 `" \4 U( `
PHA
6 O: b$ b# Y% |* _2 ^1 r LDA ADDR_FROM_START( U0 N- \( Y% h) f5 N3 y3 X
PHA
1 ]& {8 q# H% U( L) C2 w1 ? LDA ADDR_FROM_START+11 y- v7 r* j( }2 D% q' u
PHA
: c3 \' z7 A. s5 c- z LDA ADDR_FROM_END
: R5 K& O1 b5 A( ], r2 q. ~ PHA$ Y, ~  s  n5 \7 s) V' t
LDA ADDR_FROM_END+1
/ x- i1 v! ^9 a, x! _ PHA
  a' v  C; C* f7 A9 ] 6 C4 C1 D$ _" V' T1 K- K( a
OFF_INT:   ;屏蔽中断
1 v& p+ Z4 U5 r, H" S" a4 l# E LDA INT_ADDR& y5 m7 T1 D1 G9 w! H* o
AND #$7F
! F3 l9 W2 U- ^. y6 D STA $2000    ;屏蔽中断
: S5 h4 E+ U, Z+ k- [, \. O! s5 Y: O# n9 a$ x7 N8 k

/ {* B% Z: ~4 O( g7 G8 dSET_DATA_ADDR_START:    ;设置复制起始地址
' o3 p0 K4 d  ]- m- K& C4 I LDA ADDR_BEGIN4 d4 A. ]3 k0 @2 h
STA ADDR_FROM_START    ;设置复制起始地址低位
$ u+ n+ c3 i3 @9 @" J LDA ADDR_BEGIN+1( V8 k) {- M: @, f% W& a4 e# a& o
STA ADDR_FROM_START+1    ;设置复制起始地址高位
. k% N4 P0 n3 Q2 n2 h, Q; [! F* X - n7 }( E8 [2 t; A; \0 b- T4 [3 g! f
SET_DATA_ADDR_END:    ;设置复制结束地址
  i3 l- F  [  [  G+ C LDA ADDR_END: \+ T" x4 O9 _' B9 R
STA ADDR_FROM_END    ;设置复制结束地址低位
) m* K- d& d) R8 z) M LDA ADDR_END+1
$ z" X$ Y* r5 n STA ADDR_FROM_END+1    ;设置复制结束地址高位
, k; b0 w* ]8 r, d; A % c3 @3 q4 {9 z/ e
SET_DATA_COPY_START:   ;设置目的起始地址2 I/ F6 y% L9 O  y
LDA ADDR_TO
& Y8 p: {' J* e" ^7 [0 a* J4 B" z5 Y STA ADDR_DATA_TO   ;设置目的起始地址低位' v# h& k* r8 r
LDA ADDR_TO+1
3 h# a3 ]8 \: A2 s: u( ]6 G1 u STA ADDR_DATA_TO+1   ;设置目的起始地址高位4 p3 Y; y0 l( @' P2 l, T+ ^
0 p/ Y, V6 S% g- x( ]4 l
OVER_COPY_CMP:    ;复制完成比较+ u+ j2 }& M! Q# j9 ]: r1 y
LDA FLAG_OVER
& j9 y  m) K7 |; @8 I& y CMP #$FE    ;复制完成标志比较- c9 e& t3 I  k. L% Q' e
BEQ DATA_COPY_EXACT* G- g  l/ D5 K, {* X
- w( q! U) |+ X0 k: U& j
INI_XY_COUNT:   ;计数器初始化
& w3 W9 }6 p: `* X, i  o/ B LDX #$00
, p! q* ]2 c/ I+ X LDY #$009 l& X4 Q* |9 O5 J

8 X8 z" i) H& `8 |. n# s% sCOPY_OVER_CMP:    ;地址比较
8 m& ?% H6 p7 }1 q LDA ADDR_FROM_START7 i& O6 x! o. o
CMP ADDR_FROM_END: C5 ~3 ]. O: g4 X
BNE COPY_START
7 w  L. p2 r7 }: x; A+ B LDA ADDR_FROM_START+1! R2 X1 W  t0 {, {
CMP ADDR_FROM_END+1
6 z8 y9 {. h( N* v: F BEQ COPY_OVER
- g1 G5 Q3 l3 `! e. h4 o0 t7 n
2 U, ~) m5 u; G+ a. JCOPY_START:    ;数据复制开始; U0 b3 i: S3 x
LDA (ADDR_FROM_START),Y    ;读取源地址7 }. T7 C9 d+ m$ f6 n+ U
STA (ADDR_DATA_TO),Y    ;写入目的地址
* F+ Z6 ]' O* ?" j7 i  L INC ADDR_FROM_START   ;源地址低位递增+ w6 i9 ^' t0 y
INC ADDR_DATA_TO   ;目的地址低位递增
. \1 N  P0 C% `6 J* l+ s; h" [% x. V BNE COPY_JMP
' {& l0 Z" [+ z2 {8 | INC ADDR_FROM_START+1   ;源地址高位递增: B4 I( c- l2 t& E# c
INC ADDR_DATA_TO+1   ;目的地址高位递增1 c* \; n, y  E

0 q' _  p& q9 u9 \& E; uCOPY_JMP:   
! h1 T* n# y( |8 R JMP COPY_OVER_CMP& d6 F' l1 I/ r( z
; f) C7 r. ^2 M, z
COPY_OVER:    ;复制完成
/ Q! ~- m/ i; G( ]% g LDA #$FE9 ^/ O+ ^' a; Z$ u+ \2 [  v
STA FLAG_OVER    ;写入完成标志
1 ^3 X' k1 ?3 S9 @1 s3 OFINAL_BYTE:! T1 C$ ]& h4 X* ]6 m
LDA (ADDR_FROM_START),Y    ;读取最后一个字节
) g5 P6 X( v- p STA (ADDR_DATA_TO),Y    ;写入最后一个字节: y& w5 @/ v5 ^. O+ X# f; Z
, D6 B2 j1 c2 n5 l1 i
DATA_COPY_EXACT:    ;恢复数据1 X, l* z" u# P( U2 V
LDA INT_ADDR
# m1 {$ n( C: r- i# B2 m" ^8 K5 {# q4 V STA $2000    ;恢复中断1 L' G) @2 ?5 Y4 Q$ y
PLA. R$ r; y- W. Y0 T  z8 b7 ]* Y5 y
STA ADDR_FROM_END+1
8 x6 H4 w. Q. Q3 ^ PLA
0 h/ I1 W( M5 A/ p STA ADDR_FROM_END
; z' g" h9 G+ o PLA
, k+ V0 e; D9 b+ ? STA ADDR_FROM_START+1
: d1 I; F3 h/ j5 M% R6 M# C+ ^: B PLA
/ [+ h( v* t' ]& B+ T4 z5 q5 R" y" ^ STA ADDR_FROM_START
# u$ U2 T7 x! W; a- q+ G) I  m PLA* b$ M/ c4 o: T: u! {* n
STA ADDR_DATA_TO+1
' ]" B- T) q4 P' k6 V& {  I9 K PLA3 @" _3 X( T1 U. X% w, w7 U
STA ADDR_DATA_TO
9 J. v1 w! X  l5 B0 K' F PLA0 k/ v& @# w" T5 }2 u0 B1 L9 S" Y- e
TAY
& E6 O; r3 X; I. W2 o PLA
3 t' N7 @9 U) `. }9 X1 f TAX5 M  k. e; X# J0 ~
PLA& [1 s2 b4 {5 n& v# t# u
PLP
0 ~! [4 a# }' ~. [5 ?, i; j* e0 l
# i( {' [6 G7 T  Q* y! m9 u& J4 w
( w1 o4 `3 d# N0 D. \$ K   N8 a: R, h1 S  x: [
DATA_COPY_RETURN:  v* R  W9 C& |6 a/ v! e, w
RTS
+ t  R6 s& Y- H& _+ T8 o) V
# U0 Q$ _  Z5 l: ?( R1 ~" f .ORG $C056    ;精灵指令覆盖
# m$ }4 }; I5 o* @% Z0 f JSR $FFB5+ t. A; g' ?" G+ \

' G; v! m' }! ^6 o$ ~2 @+ _ .ORG $FFB5    ;
/ s% ~6 I' F  P) L/ o PHA7 r+ ^) ?- R) ^% n' K# F6 V2 E
  TXA
2 C5 ^, `3 l7 }6 j$ n/ k2 N* K PHA7 `% k( N8 h) n- u9 P2 X& f! E
TYA0 {0 l- ^' {6 b4 L; V9 J- d
PHA* a0 N2 j0 f. j. ?
LDA $71FF    ;比较7000-71FE数据是否完成复制
% ^$ V) e  H: Y) `& y0 \6 Y- ^- _ CMP #$FE
  v9 k3 }" b  A$ m, @8 Y9 u BNE ADDR_FFCA0 `, p7 f0 B" J* W9 Q- D
PLA
5 C; T5 a( P3 c% P TAY
" N, I: b5 k3 E/ q" h PLA
5 {% j8 l7 o5 f, o1 H( K0 T8 u# R TAX
& o4 y8 u0 \, `% p0 G PLA5 X% H% D# T0 P0 R7 o0 `! s6 [" h% v
JSR $7000   ;跳转到自写程序, V; V% ]$ l9 s5 X/ ^& P0 J1 `
RTS
, B" z# _9 x, p7 c, Y  }4 i3 c' T# NADDR_FFCA:
9 Z* M, E: l+ L) E! R PLA
% L6 o! k* |' w! H6 J! w# o+ i TAY& q/ e  o" k0 _4 O$ Z6 e% J6 Y! U
PLA! V. x/ _3 s# I
TAX( a6 d; h+ I7 [: u! {0 A
PLA
: Z, V& A/ h8 ]' Q' _) C( G6 Q* P3 G RTS3 t5 G  R  C) L7 s& }1 |% u9 k

" R. n# X, x& x; C& S/ X
# e* ]) s- r  ~- c; b' U0 p( h! J% G4 U' d! K. c; t
.ORG $C264    ;自定义的MAPPER2切页程序
0 C, S% \: M: ~ PHA4 {2 M# \! a* }* i4 Y4 M" k# a
TXA
2 v3 G9 y2 k2 j0 ^+ j; L, j PHA# L$ N6 P! [5 c+ g3 f; t, O
LDA $00665 |( ~( H) |) }' ]- ?6 `
BNE ADDRC280) T: f" i/ u/ f5 |6 r5 x
LDA #$07; Q2 n  r7 v' [2 E/ A4 C
LDX #$03
" ~" W0 Y8 Q, w+ M& \$ v+ V: E JSR $CD9B    ;自带的切bank方法
3 k, I! v2 H* u- K PLA
6 h' |) X; l8 {. S9 H. a4 I TAX8 `9 L5 r1 w* n0 }! k9 f5 |
PLA
6 g' v2 e# t5 p1 C JSR $80004 ^  Y( F! M; b3 y3 M
LDA #$06
( @" p2 ~( Y2 x" M LDX #$03& E) I: a& O; H8 `6 K3 }
JSR $CD9B    ;切回原该切得bank(可以不用)6 q- p/ C5 @' o9 }
RTS
; j( B4 ]) @7 J) GADDRC280:
& {: i' h) W  H PLA
9 B/ k% W" N, r: v" O4 m TAX% `1 U9 L7 C& O) F
PLA
% X3 E/ U8 G2 i0 d. X( P RTS
+ q" f5 b+ z( {, K" l! L * D* f! X! v9 N, B
9 O& c% S9 q7 }2 T  l
;[FC][最终任务PPU][END]
# L4 _& k6 o/ e, x( W5 s .ORG $C056    ;跳转到PPU重写程序/ [0 m5 Y% k+ f' E: _
JSR $7000% y& k  i5 V) f+ |

! ]) p+ o# |+ f9 D$ }& C6 X% p .ORG $CEBF* Z" C( M" d: r
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入; b& Y+ v& |- b8 p2 D6 B) Z
  
' ~1 K+ b5 S7 r" Z9 d  .ORG $E460
2 ^0 l! t* J$ s' P6 q  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入, m, k9 b% b  @7 T
  ; O- v9 Q9 ]  ]  R) g, j
.ORG $71F0$ O6 D9 S" i8 e: B4 K
STAGE_DATA_WRITE:2 Y# a% f4 p& i9 e$ ^
  LDA $6010
. x& O' k5 Y' C! {$ B4 f+ w  STA $1E    ;关卡写入% j; @' Y, w& B1 p' e
  LDA #$00$ N1 q+ V  ]# @
  RTS
: `4 P. z1 b& U: Y6 S# u .ORG $71C0
' L: s) a8 q0 N# u' q  {BULLET_DATA_WRITE:    ;副武器数据写入1 M2 H. }* m. [8 e. {2 g
CPX #$0E3 k; R* y3 f- W& G
BCS P2_BUL
# c4 g: U; `" b2 O  E# ?5 JP1_BUL:
. M1 J) k, \+ f3 D+ W: \. S$ d LDA $60044 K9 |8 h1 K! L/ \
JSR $D7D0    ;P1副武器数据写入) U6 Z/ b: h: w7 U2 M& T7 h) I
RTS
3 L: V" k) J* G7 `) F0 |P2_BUL:" ?% O7 t  w) K6 G1 F/ E6 I
LDA $60053 Y9 U" I% |/ g, [) r4 ^# m
JSR $D7D0    ;P2副武器数据写入
: h' n, s* J9 C5 R, V RTS! a4 @8 n8 l5 N9 S! @; R
5 |7 W  \$ Q. l/ s! `- `
/ E" S9 h" u$ Z
.ORG $7000& |8 k: u" |3 p' o+ M: @& Y
  
' j5 f& N' e  R6 E% A0 E STY $4014    ;补上覆盖的精灵写入指令. z& n& Z8 q& y' x/ H& o: s
PHA
, c, e; U: m2 D) c TXA9 `& ~( g7 Z" J5 j
PHA
& _2 }1 m( W8 `+ y TYA
1 M, a0 K, T  }5 Y PHA8 K, R7 h1 @" ~) s" \$ c
LDA $0C
8 ]1 `! V: o$ P' V& R* p2 k# { CMP #$01    ;比较是否为标题画面. e$ L) P% g( [% D. G: J2 Y
BEQ PPU_STAGE# J" G3 [* `8 x/ O* V
PLA$ b& |! @4 ^0 J. f- m" Q
TAY  G* d. b/ W( t2 c$ L1 Q
PLA  U7 P8 V0 P1 Z  N4 l# S  H
TAX
$ U& V1 R8 {" s) f3 u) n PLA
: M0 Q3 c9 M8 {, o% a7 @+ f0 F RTS
* N6 j4 J7 L0 g$ v4 a7 Y4 kPPU_STAGE:    ;STAGE显示程序2 i& b) D4 L$ T* s1 a
LDA PPU_ADDR_DATA
3 _' m+ t0 ]& Z9 T" M8 p% P STA $2006# }$ h3 p0 P) P0 h
LDA PPU_ADDR_DATA+1* u0 v  e; L& o6 u) ~& j
STA $2006    ;坐标设置! K9 Q* ]3 x" I  j/ g. w; A0 q
LDX #$00/ q1 |! |1 J5 x  k/ ]+ {
PPU_STAGE_WROTE:    ;写入STAGE字模
4 [) h+ q! R% b6 O4 e8 ^; ~2 C LDA STAGE_DATA,X
2 v- [7 l, X: d- h0 W6 g+ i" M STA $2007
# l1 {2 W- g8 l( u INX
$ I0 C2 L6 x3 B5 E! \( I) _ CPX #$06: h; s+ c. O7 B2 X1 D9 K( `- ~
BCC PPU_STAGE_WROTE
' [5 n. ^0 O! t( `+ t' x LDA $60104 L) i( R: J  I
CMP #$FF    ;关卡数据初始化条件判断( I9 o( Z+ z! M) |* h" u
BNE KEY_B
" a, s' O9 n- W LDA #$00
% n6 h6 S7 q' p1 d  }- E STA $6010    ;关卡数据初始化
- D" a, V! t! S( `5 R* sKEY_B:    ;关卡减少+ N7 q" q: z( F# V5 T
LDA $04
( i+ D5 t' e- W& J4 ]* v* Z AND #$42    ;按键B或左减关
: F( O! `7 k4 k; q BEQ KEY_A
% h7 M+ k' K2 i LDA $60101 Z8 p4 W( l8 Z% M6 y6 g" D
CMP #$00    ;关卡比较" |/ `+ W. s0 I$ L- B/ W( f) f3 G
BEQ KEY_A$ V5 r- o5 l0 Y$ x; q2 [$ q5 H
DEC $6010   ;减关1 ~: Z0 U+ i0 G4 Y! y
KEY_A:    ;关卡增加
5 F% E( e& @! p- o1 |$ w LDA $04
+ S+ V1 V, V0 I( l AND #$81    ;按键A或右加关' Z+ d% M6 n) J# ~' L0 g
BEQ PPU_NUM_WRITE
& w& q; O* x' i7 X1 g6 y% j LDA $6010$ Y/ p  V3 e4 M" S7 Y
CMP #$04    ;关卡比较+ z+ G5 `( d1 ~8 G: Q9 L
BEQ PPU_NUM_WRITE5 q4 C7 O: ^5 G8 d7 S
INC $6010    ;加关
3 m- h) }9 @4 b5 e+ qPPU_NUM_WRITE:' ~0 p3 o' {. U& t/ K; l
LDA $6010# d% ~& k1 c( D" n
TAX
, P  M5 g) h4 Y; y5 R" Z3 c LDA STAGE_NUM,X    ;写入数字) i& {( @. L# Z5 s2 f7 a& J
STA $2007
, r0 I) r! M: O6 E1 _# hPPU_RTS:
$ w" y3 J! v: I3 S PLA
! d! ]0 `7 Q1 F( K TAY# P4 L! h& k1 n* J; Y% q# _! Q+ i% M
PLA8 |0 z4 c' c/ j  U
TAX
: m7 F# f: [! z: f PLA$ l8 Z* e6 K$ i/ o! W
RTS# g9 o) k) |; \3 h" s3 a) W
3 J* p- ]% ~$ o+ v  A% @
- y+ c6 s- R. U6 F
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据! L. b) l2 l# W8 y5 A
.BYTE $EC,$ED,$DA,$E0,$DE,004 v3 l# _2 J0 [8 ?. B
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
( O! s1 F7 k2 X/ L; B; ?3 f0 } .BYTE $D1,$D2,$D3,$D4,$D5
7 V2 j; H9 D/ r! V" u  {* A/ _ 4 `  [7 }) Q# m, j
PPU_ADDR_DATA:
$ y1 n1 I: {- C; _0 S; L% o. t+ O .BYTE $23,$0C
- ]% J2 R2 Q! `/ ` ' s  P* u2 t- R2 E8 {# i6 [

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2024-9-24 02:26 , Processed in 1.105469 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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