EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 . Q$ z! ]1 u4 x" w" p7 w& }, a
; I- C# R( A0 i3 o8 G9 w4 D7 t- [- `
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.* R* ~2 B9 C, W; J
然而,今天想到一个思路.
) I" n: s, ]: _  G& F' H: s! c* Y1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.9 Q. M9 l1 Y- C+ Z
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
5 y, }; E4 X& _: q! y3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).' _( d+ ?) l8 L7 U6 e( c7 X
: M+ y9 T: N2 y2 }/ j+ J5 J

( ]0 ?6 B& @" d;[FC][最终任务KEY][END]' q( ^2 R7 Q) Y: ?* j$ s3 L
button = $04    ;单次按键
/ b, L1 u6 Y+ T  y2 ~% X5 _8 U7 d' dflag = $6000    ;功能开关标志! G* X+ R8 J  X; C
pause = $000E   ;暂停地址
( m* I# R4 k, s& S4 C0 p( v3 x7 g0 f0 C" U
.ORG $8000
8 H* {" j$ U5 U' N6 ^ LDY #$08    ;自带的按键程序
5 B/ r  C1 _$ bADDR8002:* n" i! j; n" ~3 j( `% ~
LDA $4016,X$ F8 f! w% K6 w" ?: M
LSR
& {  s# G+ q/ K8 A. s ROL $0021/ `: u! T% R: d
LSR; u. `* a6 T. r
ROL $0029
. ?" L2 }# C% R DEY6 ]0 d( V$ m. W7 C
BNE $8002
# m) {0 p4 ~5 f* D9 W) R* o4 a LDA $00218 g/ l' g# J# L* z" f; N& Q. l
ORA $0029
: R* P; O+ w, ]3 K  c STA $0021
5 e7 N' B; A* W. X LDA $0020/ I% Y* `- |5 t
AND $0021
7 {. q" k8 h3 o. A% s2 R6 L6 z' [ STA $0020
' H7 B5 k* ?- z) z3 {) y LDA $06,X  t% U, m' ^' T. \$ K" Y3 F& T
EOR $0020: L( }( _3 r/ E, b6 m2 a& h" @
AND $0020& G. t+ @$ P$ K. o9 m
STA $04,X1 I/ G1 h  ^4 U' y, d5 n9 @4 b
LDA $0020! \2 ?. B+ h8 d4 o) E; a1 ^
STA $06,X
$ [& |" m9 R5 Q) Y9 I( _ JSR KEY_OPERATE
# l! u1 T+ H7 G; v JSR Function    ;功能调用# x8 p' f& y( W1 q3 t
JSR Weapon    ;武器切换调用
; \5 P% ~; N5 Z7 s% L( }4 A* E JSR Power    ;威力调用3 Y, K6 ^2 O' v
JSR BULLET_NUM    ;子弹数目; u) F  z/ G" S" t* o! v1 N
JSR BULLET    ;副武器类型) d: |. N$ p3 z7 L
RTS
6 H& w% N2 D; i9 [/ f1 U. A" a' |" o
* R" S8 g3 Z2 `6 T& z. s
- ]0 i( ~9 G3 r4 ~: P$ d
/ s3 Q/ l" m! u% ] .ORG $8050/ }; c2 U( \% a/ ?1 B
Function:    ;功能
! P/ B# O2 Q5 z/ ]! v6 E) S8 jWUDI:    ;无敌- x- \+ R- W* x9 m& ]' Q
LDA $6000,X* V8 C7 ]9 b8 I/ w0 W& z
AND #$08    ;开关判断# p; k3 c0 g- X
BEQ LIFE0 y. @$ K6 D, _" V1 h+ ]- `3 t: P3 W5 |
LDA #$059 P' u% Q, Q8 ~% }1 @
STA $05DC,X    ;无敌锁定
5 j+ c4 L4 x/ q& SLIFE:    ;生命; I) A* l1 ?/ a0 E" Y
LDA $6000,X
1 f8 o+ ~- D* r$ h1 j# U AND #$04    ;开关判断$ D' V6 V$ o! _/ O- p" i
BEQ FUNRTS% K0 Y, L7 [( K# O% i( K; V
LDA #$050 N. ~/ G( x( q" R2 y. R. ~3 ~
STA $1C,X    ;生命赋值
& s1 E! P8 P6 w5 t" h; [FUNRTS:
. K/ l% a: X4 @# m' W$ h& T RTS3 V% [) p& b* Y8 ?, S0 t# y
& S' N3 W/ w. d  ^3 X7 a
Weapon:    ;武器切换/ h# {/ v' O' r
LDA pause    ;暂停状态判断2 y1 a9 d. \; L# u4 I
BNE WEARTS4 w& p8 v* T7 ?3 X' q1 S$ S3 G
LDA $04,X/ a/ `4 E( B6 O+ G4 ^9 k
CMP #$20    ;选择键判断
% F. Z0 R+ L  O( z4 S% x BNE WEARTS
0 E7 V. O, R" L& y LDA $12,X
& T3 Z& e. i% H/ w- S; b* u CMP #$03    ;武器值判断, V/ x' x  s! n, c2 y: D7 Z
BCC WEAINC7 J% m  Y; R3 z* ]2 E
LDA #$FF5 w" s/ ~+ \; a- x* w7 K
STA $12,X    ;武器重置
# ]8 @* n+ c, X! |% b. x$ TWEAINC:4 j9 p2 r. w3 q' f( v8 e6 Z  d
INC $12,X    ;武器增加
% g% R! M6 j9 |. x( b' b: z. @
; z! N$ E5 @3 W5 J& c% g' WWEARTS:
# X+ v; E" S- `% Z  m$ U- h RTS  H3 `- a! s% n1 y

7 @: J" L: U, H/ a( \0 JPower:    ;威力
/ b! U9 Y' c$ U- }/ _: D LDA pause    ;暂停状态判断2 d4 C" q! f0 _) \4 t9 y, i* _8 V
BEQ SPERTS
4 J% ^. b# }! S8 U0 \! tBUT_LEFT:+ ]& f5 [' k" j9 o0 X2 L0 P
LDA $04,X
# U- T7 ?, ]* M' c0 Y CMP #$02    ;左按键判断6 J0 p' d& C# f( d! Y/ A
BNE BUT_RIGHT
5 X  a# G, C5 M7 Y% | LDA $88,X4 q" j- _- L1 P& E9 X- ]
CMP #$00    ;威力判断* j1 c" y/ H' y" g; D
BEQ SPERTS
% {$ k6 E0 N$ E3 c( d+ TSPEDEC- i/ R& [6 j4 Q, y
LDA $88,X    ;读取武器值
% I9 J$ E' K/ Q3 T" I2 a; `- E7 { SEC& i4 A* e. s) j  P
SBC #$08
2 n3 M: _. E' }# h% R. C& R STA $88,X    ;威力减小
) T7 a$ ^$ l0 a0 I8 N8 Y# zBUT_RIGHT:
0 W( K3 n/ f' B8 J LDA $04,X
; m7 Z! U% _) k& p CMP #$01    ;右按键判断3 x& f( Z- q4 s
BNE SPERTS
3 F' e3 _3 r3 @9 ~# I LDA $88,X
! ^/ Y9 h8 R9 d5 Y' R$ y) O CMP #$10    ;威力判断$ I/ d0 @! A. L% A: i
BEQ SPERTS3 g) Y# o+ y$ r1 V
SPEINC:) D  E0 N% I$ L, c
LDA $88,X    ;读取武器值
' I( ?+ y! @5 X$ T/ e CLC
* z0 _) x5 K! R- k6 _; e  A ADC #$08
5 O" X, w: Q) _* g/ { STA $88,X    ;威力增大& s* i% @: h1 w# P- l0 b
7 o5 O; ~3 J# G& Y3 P/ ]" w/ d$ `
SPERTS:2 h9 f1 f7 f' F. S) i9 D
RTS
1 D. K7 E2 d1 d' q! k9 ?
' W. Z1 C- L6 `+ C' u  K0 UBULLET_NUM:    ;子弹数目& o% @- Y; R. S1 T
LDA pause    ;暂停状态判断9 d4 E8 J# @# W- f
BEQ BULRTS, X: c5 q9 y2 I  N1 C+ L
CPX #$00    ;主机玩家判断
( m$ Y8 f5 ^, E: r4 f8 s/ m BNE BULRTS$ L( y9 U1 J: c# O# ?& |1 H
LDA $04,X    ;主机玩家判断8 q1 ~+ h6 L6 S. r8 [
AND #$80    ;按键A比较
3 N& ?( h- L% S1 J BEQ BULRTS
$ b! e$ _1 d1 U LDA $87    ;状态判断
6 S6 t, [7 N9 n9 j BEQ BUL_23 R8 h# `* w/ y) {
BUL_1:
* C, ]. j( s+ s  |$ D$ O1 N LDA #$00) N- B3 U! h. ^1 {, {0 m9 z
STA $87    ;1发子弹
1 M( P$ X8 k& E/ l. G! i BEQ BULRTS
3 [. n. w) E. Y$ H9 M7 _BUL_2:5 M5 o: b; c2 {% y4 I2 D9 t/ Q  o/ T
LDA #$01, e, v" y% J  z$ H7 O
STA $87    ;2发子弹
$ V8 k  z  m+ P
/ D* V/ D0 G# z3 SBULRTS:! j0 f* y6 a) I2 \5 A
RTS0 |( k; W) [3 \; K9 |! D/ g
. D+ k$ i9 x% [% G
2 \/ P6 [% s  {) V" j5 j
BULLET:$ J! b" r7 T5 l9 T- t
LDA pause    ;判断暂停状态
( v& N7 _+ c8 m, J7 V. x BEQ BULLETRTS0 A; @3 n) n$ Y1 I
LDA $04,X
" H. c5 O& k; x5 Z- L3 p CMP #$40    ;按键B比较( o# M" t7 w+ Z! @
BNE BULLETRTS3 m4 F- E- r, O3 x1 @
LDA $6002,X    ;读取副武器( d1 I( ]  s) c( J9 m
CMP #$039 S% a. N; k; o8 [- K
BCC BULLETADD6 n! V* e+ q' a1 O! a; p2 a
LDA #$FF; g/ v' C/ h; Y
STA $6002,X
& _' X8 X9 u* g: PBULLETADD:
# R1 w' H9 G% Q- w/ U INC $6002,X
% |5 M9 V. z/ ?! [ ) ~# w4 ]7 K# [7 ]! Y# K% G1 p( |7 ?0 x
BULLETRTS:
* z2 y- c  s% m( M' B" s6 ` LDA $6002,X
) h) W! n. l! i: h& ^ TAY, p3 o: K2 Y6 J: K& w8 P7 I
LDA BULLET_DATA,Y2 S) _. \4 B$ b6 t
STA $6004,X    ;写入副武器数据
: m, {1 Y/ j2 L# { RTS% ?& y5 b$ U" X# x; ]9 U+ s$ M

$ h8 o% A5 \( ]4 b0 G7 K ) c  L1 {0 u3 y7 x' _9 F
BULLET_DATA:
' E, n6 h. N0 b7 F .BYTE $06,$02,$03,$04
1 a- h  \6 {8 g! v. C5 V
! {1 l9 v/ l; ~1 \/ K' Q" J( ` 2 m7 J* ]( v1 G, q: K) M$ s' w& L. w
& L/ U+ n, t% @- X
KEY_OPERATE:    ;按键开关操作' @0 K3 e' }+ L5 ?& z4 l' c
data_protect:    ;数据保护, b" P4 l. B) l$ Q; T2 V
PHA# a  [* _% o# n3 J
TXA! w# P/ I- r$ \3 u
PHA
8 \# b) b+ [4 y1 w TYA
3 Z: i0 y* ]" a& |0 W& B- N PHA
& }% I# E  e) L- Y- ^' S
2 p& I& @& ]9 UFLAG_INI:    ;开关标志初始化
1 s$ R& V7 I; U3 E2 d5 v6 N& `
. Q7 E/ z- ~$ z: K! t LDA $600F
( e* O5 D9 M: C  L. @ CMP #$01
0 w' ?6 b9 I9 p* @& @ BEQ pause_cmp: v! d" w* j4 E1 k3 k; I5 W2 u' [
LDA #$00
3 u: N! k8 w  W* @+ j, o STA $60003 b" Q3 a6 p0 O  y
STA $6001
& P: ~! I9 f0 _! q7 ~ STA $6002
% i. X- t6 q$ Q" N2 a3 Y STA $60034 g! ~' t% h0 [% z( w9 [5 W
STA $6004) t" q+ y0 S+ @* r/ a
STA $6005% i; Y/ l- x3 g0 n3 I) P
LDA #$01! o5 F; l- b/ h$ B) |
STA $600F
* N$ v2 W+ B( g5 u9 b + X* y, n2 ^3 H7 D. }( q
pause_cmp:    ;判断暂停状态( g( q% i1 L4 }
LDA pause
# X9 B2 L1 s; h6 r9 R CMP #$01    ;判断暂停状态  g4 l6 P' ?8 c
BEQ button_press& \/ |) V* P' a
PLA8 S( H8 F+ X. v
TAY
2 x( d( O5 `1 ^+ L PLA$ V3 x* b3 T! U" O. r' ]
TAX1 R  {1 X8 k% l
PLA
5 k# F& K( S* _0 I) F9 w RTS4 G4 I3 B9 C" |3 I# k  P2 o  P6 O9 ?
3 J& G% g; g# r1 @& w" B
button_press:    ;按压操作: @6 f' V1 O1 U1 F9 v- E
ini_Y:
1 N! q1 F) U) _  G9 v LDY #$008 t: ?9 Q7 r0 i  F
button_cmp:; F4 A4 ~% ]: x9 q2 Q( C9 I' d$ \9 k0 n
LDA button,X
, e; ~1 j* v( n: j( b  u CMP ora_data,Y7 P5 ]8 k( |; k! ^! Z
BNE count_Y_cmp( A5 k8 z  L- G4 C% q
flag_cmp:! i+ d9 T  l# A( }2 V2 R$ L
LDA flag,X' [  x  d- J; i8 }
AND ora_data,Y5 s8 i% q5 E8 |( ^0 [  ]
BNE flag_and
" @! q8 j2 M2 wflag_ora:: b2 C( M: S6 j; I$ J8 H  f
LDA flag,X
/ S" _( c0 p- I& y* ]6 O/ H ORA ora_data,Y" T( O% ]( L1 @" T- D' T5 M
STA flag,X
& w; K  O6 o# n" L9 n BNE count_Y_cmp
# x- I7 X9 ^, n2 B) c8 ^+ v- U3 Iflag_and:2 H* i0 z& z& H# n  g/ `5 K" K, S
LDA flag,X! P& h5 I) B9 n5 z# W
AND and_data,Y
% u' C, j# c3 I& V' @% L. i& j STA flag,X
$ J! ]+ ]) q( i8 ]; m% Scount_Y_cmp:
9 U$ `) e" }6 `* `. V INY# ~; i* L! b3 i) A
CPY #$08  T2 f! ]) r- N+ \
BCC button_cmp8 y5 ~( R2 j) B& @" {. A& T: n' T
9 z8 \0 |9 E; d
data_extract:    ;数据恢复
5 Q& b  {) S! b- C/ t, j PLA
- N3 M% d/ C6 S% D4 t; ` TAY( k/ S6 w, ^( ~9 T
PLA2 P! m, x* Q! h' I4 ^+ v
TAX
0 @0 V9 W& @6 X) W1 V PLA
; g) h0 I$ n5 T* V( X ' e: i2 j7 G+ x
return:3 i* |, p- [3 T5 p5 ?
RTS
: ^  q, V! R. o6 f; m$ v
/ r5 C; E+ r& `" Nora_data:   ;按键相或数据2 [" Q7 w2 A1 G, F
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
1 H8 C, J. y8 g4 H* Z3 Yand_data:   ;按键相与数据
) R, l2 n, J5 z& F; Q. j4 ? .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF9 `5 x$ N3 ?  v. `* y

& r( L- L! v) |
; `* T9 r  P2 w9 H5 ]' m : m4 h1 U$ _& ?
;FC数据搬移程序 BY FlameCyclone1 Q! y9 \  b6 F/ p5 |
.ORG $8200
+ f( k# |- ~  L8 i- K+ g: ~ JMP DATA_COPY_PROTECT
& R' s2 a3 R9 L9 Y* z7 W" O/ s# U! q: e
ADDR_DATA_TO = $40    ;目的地址- j/ l& h; T6 J+ Q8 [$ O
ADDR_FROM_START = $42    ;源开始地址
2 l# e0 u1 y: }$ N" `: U6 vADDR_FROM_END = $44    ;源结束地址9 `9 i) t) c% q) O% G
+ E4 V/ e! R4 w" G9 U+ t* h2 A2 _  d9 M
ADDR_TO:    ;目的地址
1 V: I: j8 _) T$ g" p .BYTE $00,$70
$ V; U, m8 Y! Y2 GADDR_BEGIN:    ;源开始地址
: t  j8 G3 k7 i! _) I$ _% q. g; w .BYTE $00,$83
* t6 U, l; Y# GADDR_END:    ;源结束地址$ l! t& b" O. v
.BYTE $FE,$845 X9 C" F7 c# Y
4 I/ L: c( a4 S6 S: X  V$ A
INT_ADDR = $08    ;中断地址& P- l# S0 W, L) ]7 j! Y9 h
FLAG_OVER = $71FF    ;完成标志
0 ^/ ]" M% Z3 l( N) V* t0 ?8 o7 H0 Q3 g: [
& C: R" {; e$ {7 z
DATA_COPY_PROTECT:    ;保护数据
) R' Q& [' {9 X7 h PHP, \* x2 ]" l& T
PHA
9 B5 B8 m6 o$ p  }  ] TXA
/ w* P! h* R3 U. K1 H1 u PHA
( q  N! @5 d$ [5 c TYA
* ^/ P2 b  N3 c) V$ C- j PHA
4 h% I# }7 J0 W  b) W& B2 h$ @ LDA ADDR_DATA_TO
) F: X, ]5 k3 D% Y/ j PHA
0 J& z8 K, y# i/ Q" o% q LDA ADDR_DATA_TO+1
6 i. U& n: D$ r2 T$ z1 w. y PHA; f  H$ l) P; Z
LDA ADDR_FROM_START. R$ o+ p, S% S& d8 }
PHA
+ J0 j4 Y- p+ q* j0 O LDA ADDR_FROM_START+1
$ Y0 D- p( w7 C6 A" C' F; _ PHA
6 u  e/ Y: q' ~7 w* Q# [" o/ j! L LDA ADDR_FROM_END; X, R) T; q" [6 l" M) Y8 H" k
PHA
4 G: X* t, r% @ LDA ADDR_FROM_END+1
& m  f- g! A  U PHA2 B) ~. F* }" ?

# y8 J  F7 M  V# Z* g& OOFF_INT:   ;屏蔽中断1 u. y$ z) x$ q4 l7 w8 g' k
LDA INT_ADDR
( E5 a9 n$ m4 Q AND #$7F) F$ s6 u$ S8 F& L/ u
STA $2000    ;屏蔽中断
# ~& L) O* ~1 s0 ^  S' t2 b6 F/ |  M' [/ _+ S
4 n2 P) d! V! d. G8 g, N) R
SET_DATA_ADDR_START:    ;设置复制起始地址
+ Q9 F$ P& d( ` LDA ADDR_BEGIN+ a# ^" T5 e3 d( @  i
STA ADDR_FROM_START    ;设置复制起始地址低位5 f$ R+ B3 V9 @
LDA ADDR_BEGIN+1$ p: h/ ]: n! S( d
STA ADDR_FROM_START+1    ;设置复制起始地址高位+ m& m* G1 d. e. v

3 e* ~: {9 i, ~; a5 e* m( W+ K& nSET_DATA_ADDR_END:    ;设置复制结束地址
, _- R$ U. x1 b0 o* v LDA ADDR_END) t" H/ c) T  \3 Y
STA ADDR_FROM_END    ;设置复制结束地址低位3 Y. @+ V1 n# `: k, @# r( f
LDA ADDR_END+1
8 i6 s% U7 k- m5 M STA ADDR_FROM_END+1    ;设置复制结束地址高位
9 f7 U$ Y  C# j $ F' W  b, Z# m4 ^( i4 ~6 V
SET_DATA_COPY_START:   ;设置目的起始地址: e- K( X3 W' H) F0 ]
LDA ADDR_TO
3 Z. O- ~' D4 s( o STA ADDR_DATA_TO   ;设置目的起始地址低位
1 a! [+ j6 D- v* w3 K! g LDA ADDR_TO+1
/ h1 R0 C* h7 K, R# d: _ STA ADDR_DATA_TO+1   ;设置目的起始地址高位
. L, r0 q: Z. u1 W2 C/ r $ H' E. h- b0 d* y' H
OVER_COPY_CMP:    ;复制完成比较
8 b- E6 ], s' N) V2 j3 _ LDA FLAG_OVER! c4 Y- V2 r# J2 _: i
CMP #$FE    ;复制完成标志比较
7 y5 f, Q: B3 _9 @' Z+ Z  e" N- M BEQ DATA_COPY_EXACT8 W! h& ?' g7 A( _7 G

& f; R' z! S+ n1 r2 e% f4 GINI_XY_COUNT:   ;计数器初始化7 R7 ~) M9 q/ B; [7 V( B3 q
LDX #$004 t1 B2 e3 ?' d/ X" L1 n
LDY #$001 ^# p5 W$ ]/ U# `1 G1 A

' F9 f5 x# @% {% S8 ?COPY_OVER_CMP:    ;地址比较! k' w6 D4 L" ~
LDA ADDR_FROM_START; O1 K! m& Q/ ?9 d
CMP ADDR_FROM_END
  b  f/ m: g" I& z1 S3 x' f  L1 Y BNE COPY_START8 V, R. r% ~/ t% p: a
LDA ADDR_FROM_START+1; ?5 V1 Q! H: @( t( L0 W* k% j
CMP ADDR_FROM_END+1
* a6 B1 J- V- `; l, V7 F; Y BEQ COPY_OVER
& H0 Q: f5 R5 |8 h * A; l6 Z- T7 c8 N
COPY_START:    ;数据复制开始
" G" d. a) s  v, { LDA (ADDR_FROM_START),Y    ;读取源地址8 q- I" y- r5 o4 |
STA (ADDR_DATA_TO),Y    ;写入目的地址, V6 }. k1 |6 e( v- A
INC ADDR_FROM_START   ;源地址低位递增
; {6 S' d5 j4 \8 T INC ADDR_DATA_TO   ;目的地址低位递增9 A' }0 V: G5 }6 m0 T5 \
BNE COPY_JMP
- L: P4 I( |( P6 p; I INC ADDR_FROM_START+1   ;源地址高位递增
3 G: p5 _, ~+ j INC ADDR_DATA_TO+1   ;目的地址高位递增
) P0 E; ~! ~- Q2 `& ~, A- K2 P : K+ Q+ z2 G& G- }# F: Y
COPY_JMP:   
2 v; v' Y5 ^, m# G+ q3 A: l2 B3 f JMP COPY_OVER_CMP
2 G) [2 c5 a+ j# P, q; c
4 t+ x& e3 ?/ b; u; W4 RCOPY_OVER:    ;复制完成6 W. v% B$ c$ ~
LDA #$FE
1 ?% `9 V1 a9 }" i STA FLAG_OVER    ;写入完成标志
  h2 [( Y" Z+ iFINAL_BYTE:4 z( M8 U" W' X6 ^( O5 s
LDA (ADDR_FROM_START),Y    ;读取最后一个字节* s8 d3 R4 n$ i
STA (ADDR_DATA_TO),Y    ;写入最后一个字节/ t7 E# @* h; d' E( g4 F
# Q+ E3 H8 }1 V) W" w" T
DATA_COPY_EXACT:    ;恢复数据
6 t9 P4 a$ j9 s LDA INT_ADDR" h6 h& j6 d6 o1 Z
STA $2000    ;恢复中断8 T* o$ \& E, Z) F, C, y$ c3 b
PLA& U4 N9 A1 ]! ]
STA ADDR_FROM_END+1
2 u2 u! p5 v( ^& q PLA
0 M* f( G6 s* f9 r0 P STA ADDR_FROM_END% `! o1 \2 {+ o9 C
PLA
* b0 `! p- k3 q: d STA ADDR_FROM_START+1
5 ~$ ~6 h6 h$ e3 a7 | PLA1 g4 ]% x1 T2 c: s
STA ADDR_FROM_START
* {" d( C& p) O8 e) k2 e8 L PLA
' T& _2 _2 D5 N* g5 T& } STA ADDR_DATA_TO+1
- v! c( G& {! u7 ` PLA
* F" i' M* ], X STA ADDR_DATA_TO# V" r& H5 [2 ?
PLA6 g, \! E. M% u. k
TAY4 D( X. Q2 h# z3 C
PLA
8 d% t# \' F7 y. v) _2 i TAX
- V$ C& J5 b* Q6 X2 z: H& O; B9 S PLA
6 g- d% p7 t! h0 x& ~/ N PLP
, c  s. m2 ?0 c3 Z; r$ ^( ?& S + f* I+ Q4 i$ k) _7 x( s3 G, E9 A- D* g

& t' ]3 B. J- c' J  B' Q $ J2 s6 u) z( u
DATA_COPY_RETURN:9 @; u0 Q1 S. A+ b0 A$ L" C7 ~1 R
RTS
+ Q2 U& S+ j' h1 ?0 h( j. a 5 h6 e/ G6 h; r6 [
.ORG $C056    ;精灵指令覆盖' Y5 B- p9 [+ k% X! `
JSR $FFB5
7 ^: i; n' x) y; c 1 z1 T% m% {! {% E$ y1 i- U
.ORG $FFB5    ;: I- P+ I2 r6 v+ X
PHA
7 S% n  t! f" c! G( ~& u6 W7 ~8 Z  TXA
( ?$ b$ T( E; O9 L5 [ PHA
5 t$ {; v7 C/ L0 q7 f0 i6 `& D TYA9 K& M- a+ h) C, i
PHA
0 ?, f, ~: v" M- d5 L LDA $71FF    ;比较7000-71FE数据是否完成复制) n; u) ?( ^: ]) @. ^" Z* n, C: _) }
CMP #$FE+ ^& p5 l; G; ]; |9 R- l- n
BNE ADDR_FFCA
6 ~3 J" i' t3 D: A4 { PLA: O' O2 E7 y9 N2 v; o) ^) _
TAY
3 g7 z# H5 S7 R1 m8 J PLA
9 i2 ~- D8 [! g) ]1 U" M2 @ TAX9 t' }& r* E8 H8 ^9 i% ?$ q/ Q
PLA' \- J$ L  I1 n- X
JSR $7000   ;跳转到自写程序; z: V  C" U2 c  d' G! b
RTS
" E1 b9 F" U- B) @/ f0 G& C/ JADDR_FFCA:' i0 [+ Y" L  M$ p
PLA/ }* Z5 A  D5 `3 B+ x4 a
TAY
# y  \2 W/ g$ v PLA1 Q6 M/ a6 o! M$ d; @
TAX: j" s& m1 z( o& y) g- E6 E
PLA
! g! b5 m0 b; N; L% M RTS
& B2 f3 U/ f! ^. A  i0 }, D( _, B
' R& J1 `! [, f' w, e3 b! |  M5 |" l% y* l2 f- g

5 s0 V) d" H$ M' q) m5 y; Q2 ]* A .ORG $C264    ;自定义的MAPPER2切页程序  G/ F; F2 p. P2 I0 |$ M: W1 f
PHA
$ ?7 l& `5 c  f3 T, } TXA
$ y, [7 {! w  _; }& X- w PHA8 J! e. a1 T6 S, Y+ i
LDA $0066
/ W* r* s* ~* z BNE ADDRC280
& T8 r' r2 v: P% y LDA #$07
" A, N  D- u& D: i5 j/ Q- C LDX #$038 B3 o" Z! c  T' n% s
JSR $CD9B    ;自带的切bank方法
" {$ D7 ]7 h0 E PLA
+ P$ I6 U+ H  h TAX6 G# r3 K& A: \4 [& q" o; y
PLA4 b% f# f7 ?( L, h; |! p
JSR $80005 l  n% z9 T5 m2 x
LDA #$06; [" w+ [7 ~2 \
LDX #$03, \5 F! L" T* Y  ~1 |* P
JSR $CD9B    ;切回原该切得bank(可以不用)( d' p7 w8 E4 T* F) d
RTS
0 E9 f, `0 s$ L% h& v3 U) @/ eADDRC280:; l* M" s. k, {$ d
PLA
2 t) U& H  X1 i4 k' e TAX
2 W# w9 D3 I' G! a0 i PLA
% w0 U' x; g: Z9 G8 l RTS3 a- q+ q1 H0 \! B
2 a* Z3 @6 [" x) E
. f' g1 k" ?6 l) Q8 o# G
;[FC][最终任务PPU][END]
# N) g9 n8 }' I6 h .ORG $C056    ;跳转到PPU重写程序" N) ^" g" x7 }5 p0 w
JSR $7000
1 v3 i) @6 v' }; V0 {6 a( K7 m* p1 l7 ]: m; o2 ~# `+ o
.ORG $CEBF- u; S( @5 e6 x" Q! |
JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
. }# X& n# t, D" Z- ^) x, D" k  
% ]! ~+ O) Y4 P5 x1 l# ~- _  .ORG $E460! s8 {. J' o2 K+ ?2 \- I
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入3 s  p; o' [; t6 g, ?
  * f. J( m0 q, B2 @6 }
.ORG $71F0! _; ~. w7 W7 D/ G2 C% P
STAGE_DATA_WRITE:
) r  z7 z  h" N+ B  LDA $6010' S( S5 r: n. j8 \; O/ V* l
  STA $1E    ;关卡写入/ C; k: g6 N2 v/ X- F: o1 g% m
  LDA #$00, j5 i8 W$ _% M" M
  RTS
3 W/ O, j- U5 w3 y6 x .ORG $71C0
: O1 K8 S1 D0 SBULLET_DATA_WRITE:    ;副武器数据写入  Z: U! E6 }# g2 H3 g0 E
CPX #$0E
  u' K  }9 @. a  S! Y, I BCS P2_BUL
* s0 X0 b0 D9 QP1_BUL:  H7 }* C3 D! Z& _7 J0 \1 t  b
LDA $6004+ d/ W% [6 S* n% f5 d
JSR $D7D0    ;P1副武器数据写入
4 e0 m' n! L0 d- z, | RTS/ }. s5 ]& x; R$ G; m8 Q. o: c
P2_BUL:
- Y2 w! ^) G4 H+ C" Q. Z4 B5 R$ w* L1 c LDA $6005; {0 Z. C! k& p4 O! E
JSR $D7D0    ;P2副武器数据写入* D# V  }3 H* L2 b- O+ T& E9 I2 h% n
RTS& w. k% h4 k: d  L9 y

2 o# c1 y2 ?5 l% T; [1 r" }
+ \, p  M2 Z" k+ D .ORG $7000
5 O( ^+ {  }$ n. B: l  1 G1 F0 K6 ]$ O! Q( d- {% _2 p  n
STY $4014    ;补上覆盖的精灵写入指令) n: k& |- y& M" a
PHA
! }% {4 C! F5 H8 A% S  y TXA
/ B8 e% c! D" g" B. o3 }% g PHA$ o/ R; A- m6 |+ A
TYA
" s& t5 ~8 M4 b- E* z6 L6 J; f5 ` PHA$ S7 L2 u. i# }+ F& x
LDA $0C* I7 h6 W2 R' H6 E+ b% u8 T9 w
CMP #$01    ;比较是否为标题画面
6 t2 [/ h3 ?, \8 |4 N BEQ PPU_STAGE3 r+ E( O7 p& f& x1 r: E* O) Z5 O
PLA4 L+ v1 v  Z0 ?5 v
TAY6 f6 j8 Z% u8 n: Z) Y
PLA. V; C, H7 u9 Z4 `
TAX
) i- Y. H4 b7 j  L! R. i! U+ ] PLA
6 i0 `# \0 d7 m. P( _2 K RTS" P( U& B0 \' E5 C1 r/ N
PPU_STAGE:    ;STAGE显示程序
4 r3 Z* h; Y2 ^5 ]! | LDA PPU_ADDR_DATA
5 Z4 b* R. [* _. f& L STA $2006
7 m$ C. M$ F: s$ s% K) L LDA PPU_ADDR_DATA+10 q# \; C4 K, J; P. y6 @: m
STA $2006    ;坐标设置( V# H/ B, G# s
LDX #$00
2 V8 H3 m5 U: [1 F: g, `PPU_STAGE_WROTE:    ;写入STAGE字模
: K% G0 W0 Y8 R) L; ? LDA STAGE_DATA,X
  G7 ]0 I2 D+ G* R3 T STA $2007
6 R- c0 }4 L- x/ j INX; x) F, @1 Q0 ~1 ^5 q( C
CPX #$06# e) Y. m" d. k7 w+ ^# a+ U+ t
BCC PPU_STAGE_WROTE5 E) t: d4 y6 q
LDA $6010
. W3 O2 k6 ?' D+ o CMP #$FF    ;关卡数据初始化条件判断
7 O. C' k* a4 S BNE KEY_B. l" r1 ?$ O* A# ~" W- C! g7 }8 W
LDA #$00
7 z+ r4 \  A) w) \% ^' R STA $6010    ;关卡数据初始化
, `1 A( _" T$ }5 z8 w+ ^KEY_B:    ;关卡减少3 ]5 L6 Y7 S/ D
LDA $04
9 L9 X5 x" v" H) n, k4 i AND #$42    ;按键B或左减关
! u% Q; O9 o/ }# x BEQ KEY_A
# ?+ ~' L: v- p' }3 W7 u" K  S LDA $6010
! u, w" l4 w  L5 D6 A, d/ Z CMP #$00    ;关卡比较
7 a$ k3 ^$ H9 m/ e/ p8 j BEQ KEY_A
- {% ^; b# S  W" B$ x$ l5 y0 P# I DEC $6010   ;减关
* z( j. F1 U9 j7 y  I$ t# L/ i+ mKEY_A:    ;关卡增加5 I) e! I" V0 ^+ O& z- z' p7 `
LDA $043 @  n- T* y: O) r7 j
AND #$81    ;按键A或右加关
0 V2 n5 A- a6 S9 j% x BEQ PPU_NUM_WRITE  e& n  K* t+ i0 U
LDA $6010+ W" ?/ k2 a: B' r9 [/ W2 A
CMP #$04    ;关卡比较
! n) E1 S+ c8 I9 h BEQ PPU_NUM_WRITE( k1 f/ y- ?2 H# v, l3 J+ b. k) c5 u
INC $6010    ;加关
6 f4 _! {" R, J  K: g5 QPPU_NUM_WRITE:* L7 S+ L* }9 s
LDA $6010$ e* F" {6 w: [4 `
TAX) u/ w( _8 ?5 X" O% W3 V: D- l+ S
LDA STAGE_NUM,X    ;写入数字/ N7 n# z+ I  j7 R- m' @3 G
STA $2007: G  ]. y- n- `. c
PPU_RTS:
0 `7 X# ?/ ~2 s9 s PLA
+ P& t. p6 ~9 M0 f7 P6 { TAY
' [- C0 Y& T; s2 Z5 K PLA7 {2 m" c3 k1 M2 q/ D+ o
TAX
( M/ P. c( h8 f: T/ N, T0 b PLA
/ ~. S! E: b# p RTS# b) ?7 G0 y, d8 G$ a) n% x2 Q4 ?
' V% m5 i: j8 K7 K
# a9 |) f8 ~" z+ {5 B, Z4 B
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据1 E( P6 P' M- e. c; w
.BYTE $EC,$ED,$DA,$E0,$DE,00; t0 a$ _% C/ T, U# d7 m0 p5 o+ o
STAGE_NUM:    ;关卡数字1,2,3,4,5字模数据% U& x0 n& E6 p& W) K/ m% y
.BYTE $D1,$D2,$D3,$D4,$D50 n" h# i0 ^3 Y+ z+ L' h  L

" e$ r3 x1 t8 w% O2 M0 wPPU_ADDR_DATA:
* _9 S" }2 o; v* F! \3 N( c5 z .BYTE $23,$0C% _. g& t7 U- G( @2 z

1 G9 S3 Z6 K2 O# q

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2026-2-25 05:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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