EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 # \8 L/ d+ \9 q) J; h# p9 n: C7 t
1 w/ d+ K+ P; K
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
5 l# V+ t5 u8 O) s  C: K然而,今天想到一个思路." M0 j$ A- _* t8 O+ t
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
* H3 B& f) i2 }3 N; [: X2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE2 |; {; b2 N! v
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
. C! q8 T9 Q2 C- z" m  W6 Y, Q& c. \+ ]5 c* m5 n( C# }

6 Z! P8 ]' N+ g+ ?% a. V;[FC][最终任务KEY][END]6 a8 ]7 G5 x0 [
button = $04    ;单次按键
" q4 G7 K8 l6 a# t$ y! Mflag = $6000    ;功能开关标志- q. ~7 l  Z9 T' W) Q
pause = $000E   ;暂停地址
" ?. o+ ]. B4 q. x7 p# c# X. p' ?9 i/ u+ G9 t$ R4 f
.ORG $80005 m$ u9 l& v7 N1 C$ y1 ?  F8 e
LDY #$08    ;自带的按键程序
; s" R: }1 a3 y- H; EADDR8002:+ {; R5 r, O& ]
LDA $4016,X2 w' S( [- F; Z
LSR
; G/ ^4 Y. {+ W ROL $0021
6 s: _: R6 I! J1 C, [, D LSR- m; ^5 Q6 b/ v9 Q# n( @
ROL $0029' O1 f! ~7 e  N7 i# K
DEY
" h+ N; |+ M9 T& Q9 ~; M  z BNE $8002
9 Q+ ^. O& C. @. a6 k( _ LDA $0021/ {: m  L8 ~7 B! w
ORA $0029
; S9 Q, M8 n% a& V; e STA $0021
  s- \, K& z) i; i0 _  x LDA $00206 C. Q8 X2 y+ X
AND $00212 W- @+ O% X) w8 `5 @
STA $00209 z) K" F" @1 p) q* U* J$ C
LDA $06,X
$ h+ @1 i' x2 M4 X7 L  }9 E EOR $0020- S7 l, b  Q. E: R! ?% _) P4 F' Z
AND $0020
5 ?% o' G. N; G* ~# V  K6 c" O3 I$ p STA $04,X9 o/ O. a. \2 [/ O# @# S1 b
LDA $00203 V. c  \: |0 S5 o
STA $06,X
  A4 x+ i3 `+ H, ^' x% @8 j/ F' t JSR KEY_OPERATE
' z7 T/ n' O" z8 s( z6 A JSR Function    ;功能调用
; u7 E! n5 K' e: h* I JSR Weapon    ;武器切换调用
! M- D4 [# R/ |8 e( f JSR Power    ;威力调用1 z% j- M, O. h3 A
JSR BULLET_NUM    ;子弹数目
9 ]& o! J6 f. k! C; [1 Q JSR BULLET    ;副武器类型
' t4 E( q8 ^: \9 O( N3 E! x RTS
# e* _3 ?* r1 x6 J0 R& n3 G
+ y( t+ k( X. b
( W' M, u# m9 d' E4 }9 f; h
6 P) @9 r$ {1 T/ E .ORG $8050; }# L* x% T% f7 n0 f: {9 ]
Function:    ;功能$ [2 H/ \" H5 E' u9 m
WUDI:    ;无敌
- H- w" {: d; a) D* X LDA $6000,X1 {# _/ {% ]5 F+ Q0 U  e2 h
AND #$08    ;开关判断
9 l# g  e% M( k& C  k' F, ]# ] BEQ LIFE: \0 I1 K% G+ |
LDA #$057 B" E8 c$ N6 C$ Y4 ^
STA $05DC,X    ;无敌锁定- {. Q+ }; H8 e5 B  k# f( B" J
LIFE:    ;生命4 _! U$ v# v: A1 _
LDA $6000,X- `- |. |1 k4 ~, |1 b
AND #$04    ;开关判断
" O5 U1 [, Z5 ^6 z BEQ FUNRTS
0 T& W+ s  Z/ A+ M LDA #$058 i3 i! F, K7 p9 }  f; l% U& s
STA $1C,X    ;生命赋值1 O$ R  y( M+ O0 B( s' c
FUNRTS:7 m* J5 H+ p5 s, H& E
RTS. \4 C) e/ {0 j* V

- s% m" b5 O0 ^+ ~1 R; N) R0 }Weapon:    ;武器切换( s/ ?# u5 r/ {+ |7 Q1 h6 S3 d8 f
LDA pause    ;暂停状态判断- k2 G4 H( _, ^0 Z
BNE WEARTS
5 I1 ~$ r: O0 ~8 o LDA $04,X
+ k6 }1 x$ _  [; `/ z) m CMP #$20    ;选择键判断/ Y. @7 s1 H# o( A: S: [8 W
BNE WEARTS
1 z  H# H0 k3 T$ r; ] LDA $12,X) e! P* W8 y0 F" O8 P+ a+ |  ?) p
CMP #$03    ;武器值判断
; C1 a2 {# ?. f5 N! \ BCC WEAINC- j: m* ~6 J" w& ~3 s) z
LDA #$FF
0 y7 X1 z" ^  t; e STA $12,X    ;武器重置2 F1 N2 d5 k7 ]. h
WEAINC:
+ r* O9 G0 k' w7 ?$ B, v INC $12,X    ;武器增加
0 F$ e5 k( t; W2 k- v) i# r
) d8 ?4 `! O$ R; V/ r# \4 D* rWEARTS:
$ R- E0 w* F0 K- [" w RTS7 U- k0 c6 s* N$ {+ L
) M6 X& `- x/ z5 P
Power:    ;威力8 w) y1 H8 T5 ~6 I# _
LDA pause    ;暂停状态判断
1 q% c# c# B* n BEQ SPERTS
1 w/ ^; P: ~( S4 [8 |8 J: YBUT_LEFT:
' _/ p9 Y8 l9 z4 O9 G. w4 W2 N LDA $04,X$ x/ Z! G5 {8 F. H; b
CMP #$02    ;左按键判断
0 }3 Y/ F: `- U4 {7 ?# Y, J BNE BUT_RIGHT4 ]2 o$ d8 n3 v# l7 h+ l4 u- i' L
LDA $88,X
* e( `- Y: i8 T3 S CMP #$00    ;威力判断
+ r; J8 u+ W/ W' E5 G' z& \ BEQ SPERTS4 j3 z( }7 N! i) {; |. W
SPEDEC. h* a1 {; n$ h% n1 C, M6 o
LDA $88,X    ;读取武器值" _& W; c) q8 b. B" [/ T# ?; }# f- L
SEC
0 v1 b2 Z# y' G, T8 K SBC #$08
) [5 x5 E. L7 @3 [1 R STA $88,X    ;威力减小
& G& s0 x( f% k5 q0 m7 \5 QBUT_RIGHT:& j6 ]; r! f+ b0 ^- Z: _% Z( O
LDA $04,X
& }+ l$ U! Q9 O9 W& d CMP #$01    ;右按键判断
- W: ~! E$ {6 Z* ?0 v3 H BNE SPERTS
% K; I( ^7 G2 t9 F' |, |8 Z( g LDA $88,X
% P; q' l( {$ T7 Z  D& y( S CMP #$10    ;威力判断
5 D! ^. R, u7 }9 e BEQ SPERTS
; M8 |  l$ u; S$ U0 u; @SPEINC:( n: R, A! ~* F0 J
LDA $88,X    ;读取武器值9 {4 g$ a  b9 j. ^6 V& \% M
CLC9 X5 [$ E: w) ^  ]) v
ADC #$08; J& n, v# w$ e, V, o/ ]4 l
STA $88,X    ;威力增大
" d, |' O  }! B
: J5 t* W+ P/ W) USPERTS:
2 |' X' Z( E7 M$ L9 w& e+ k RTS* N) u7 c- P2 c* U2 g
9 u! P7 u3 g! ]1 j# @% Q3 \) y: M
BULLET_NUM:    ;子弹数目
7 v4 l& W* q. m" N2 z! { LDA pause    ;暂停状态判断2 F% n( A/ x3 U4 f6 d
BEQ BULRTS* Z7 y0 G2 y& X" B1 g1 L" w
CPX #$00    ;主机玩家判断
1 O; [; b5 W6 V: ^0 G, L BNE BULRTS, S5 l5 d8 @2 q- F) `5 ?# ?
LDA $04,X    ;主机玩家判断
  z1 A9 T. t* w" R6 a+ F1 A AND #$80    ;按键A比较
/ O2 @2 z4 c1 {& ?( k BEQ BULRTS
/ x" I. }: Q' P$ n LDA $87    ;状态判断
0 p; [/ R; {% z$ M- V3 z/ l BEQ BUL_2
3 ]( e& N% |  K) u6 I: r/ `BUL_1:
" z% p7 @9 R& q3 C, _ LDA #$00
: n; E0 w5 j- N, h STA $87    ;1发子弹
  y" W3 V+ C2 {5 o BEQ BULRTS2 d! ^( \; {" ?
BUL_2:
1 g) y: z9 o5 ?7 ^$ `( N$ R LDA #$01: L  W, S7 k+ W3 j0 B+ C3 T" N
STA $87    ;2发子弹. N3 V% ?8 A: h2 j% ~
) q- V( p" S& m( z
BULRTS:3 h, w7 h2 o3 N) T
RTS1 Y- y: e! c  j* ?2 I

8 J* A" {4 `7 T) `2 j7 v4 D1 C/ k/ Q8 c( Y
BULLET:
0 v8 C, t$ r0 [. i LDA pause    ;判断暂停状态' a' A2 {( `7 s5 F) F( x4 }/ g
BEQ BULLETRTS0 d0 u, c4 q3 x- R; q3 N/ E' ~3 u
LDA $04,X
5 o) N: p2 i# u; O. ?) a CMP #$40    ;按键B比较  W5 l1 e! G6 L/ T3 T" L' Y9 T
BNE BULLETRTS
$ m, m0 R0 D% K! |" @9 _5 H LDA $6002,X    ;读取副武器
2 l9 A3 y  y4 t( V9 U+ y( X/ {. K CMP #$037 A7 \' o3 U* g4 H9 R4 J
BCC BULLETADD
' ~7 t3 J: ~1 j  A# q9 l! A LDA #$FF
: E0 J: X8 B! a) W STA $6002,X
& E: _/ V/ g; n! x8 b2 F  C8 v/ iBULLETADD:
% A9 }8 u6 I2 W3 o$ z INC $6002,X; I5 C4 |' p1 {! I% ~7 X% V

7 F2 F/ [/ \8 N( V3 b$ D5 fBULLETRTS:
# f7 r& `- R. `1 a6 a LDA $6002,X
0 R7 I, m7 }3 u TAY" h+ s- A' o" k& W# p
LDA BULLET_DATA,Y# q- R( r! G+ I6 x# N
STA $6004,X    ;写入副武器数据2 }- D* q1 I1 C! Y, A; |1 v8 c
RTS
" O8 W% ~8 Y9 i: w" F& p& W# [  o $ I+ Y0 x4 A0 Q) {

0 @& j/ e* M( I7 E4 BBULLET_DATA:( z) I' e3 V- S& e# e. m! ]
.BYTE $06,$02,$03,$040 Z, n$ T% f4 s4 D

7 A0 K5 o5 b* b9 O 4 ]+ [3 ?( Q7 L- H9 v

& F% |1 W2 A1 `; G  z4 ]KEY_OPERATE:    ;按键开关操作6 e* T- M0 }# |6 v( Z% `) ?) Z7 v
data_protect:    ;数据保护
  m# O1 @5 ]9 {( P  m PHA
6 R. G1 {, ]3 ?6 B& V1 I4 t* n TXA4 [7 }% @3 E  \; i$ s% m3 M! V
PHA
/ S8 Q5 C" K, p1 G( K TYA' u. A: {' |& h& P) X( S
PHA
0 T. k3 ^+ ^& T5 M8 `3 @* \8 [& O, Y8 S3 r7 i. s$ D0 f6 O" N; \
FLAG_INI:    ;开关标志初始化) ]/ c! y5 ?5 L2 n

5 Q/ C% H( W$ @( h; O) @8 Y0 ` LDA $600F6 _1 u8 }! Y8 y! J2 |3 h. v* ^- W
CMP #$019 t6 p* @3 P* R( ^: y- ~
BEQ pause_cmp
) L" G3 z+ u7 M7 F" | LDA #$00: E% n9 m4 X: ^! g* |* U3 h
STA $6000$ b4 p* H" [5 S) |  H% Y( z
STA $6001/ x0 M% @5 v- O
STA $6002
+ V' z: I( Y% P) ]/ K STA $6003
6 h7 P6 a4 C, z8 l STA $6004) N- a! x6 n$ D8 J" S
STA $60051 @# J0 Z4 i- Z* d/ I1 n
LDA #$01, V$ V0 g9 n# n- Y1 K
STA $600F: V7 }+ `4 |, ^, M6 _

+ X, [7 Z4 v% s# F9 bpause_cmp:    ;判断暂停状态
7 J& X3 t& f6 E2 M" x LDA pause
! f  |, ]' A# {3 E, K+ w, A CMP #$01    ;判断暂停状态
) q& y- q% K6 I- j$ s BEQ button_press7 C% P. m' |% ]& O! n
PLA* k0 ]1 N6 L) p
TAY# L6 C# }0 Y! y2 e/ c
PLA; z1 W. l3 Q/ U  d
TAX
" b: r( j& n; c1 Y/ ^( b PLA
% M7 b8 ^/ |  d- y" O RTS: V6 x5 }4 ]& ?- e3 Y/ e: }
( u4 ?8 m$ b* @; Z
button_press:    ;按压操作
6 N! A8 i" d. j( z$ H; {0 Sini_Y:0 \6 }# g+ ~1 N
LDY #$00
% F6 @" s! G7 h- p4 V* ubutton_cmp:5 Y* _4 z' W% {$ T
LDA button,X6 m. I: f) s7 v- }. h$ y
CMP ora_data,Y
) s4 l+ P: a# j8 S: o! A/ t BNE count_Y_cmp
2 [: x, L% |. J2 ?% i! e! `4 b: xflag_cmp:. h& H8 W$ ~; G: g! r( A( B" _2 H
LDA flag,X
: c) F  J2 o# R' j- V AND ora_data,Y
8 d: Q# H( o" N! @  h BNE flag_and9 E& M4 X( P$ j$ m1 f4 `  t% s' `
flag_ora:
+ w. D& {& [& {/ S* q) q4 u LDA flag,X
% h! q" O5 R+ T7 @$ t, w' K ORA ora_data,Y
6 h9 N# B' b6 o6 O( q- ~# E9 B) { STA flag,X
: e/ @) N( k) l5 E BNE count_Y_cmp* ?' \9 u% P% ]4 p1 [5 s8 \
flag_and:+ S9 Q" ^4 l4 M3 g: K2 d
LDA flag,X
! Y- F& Z8 `* _% [ AND and_data,Y" y% u9 R- t+ d1 r8 F  v
STA flag,X
9 A" R4 Y5 F9 T% c% u1 t: U9 S. hcount_Y_cmp:3 W% [! p0 l  b4 P% s
INY- X0 a0 z7 C) v4 }
CPY #$08
" M5 m/ s: H' B$ h; X" `: h BCC button_cmp! V  K. D6 J1 f$ s: M, z# ^. p" ?" a" K
' I# s2 t1 N, t4 ]& x
data_extract:    ;数据恢复' l7 u2 F, n7 \
PLA4 F6 C5 Q& |: x% j, G
TAY
, ~1 L: E$ V" C5 P9 v1 R/ g3 |9 S) A& @ PLA
, A$ \1 k5 F& ?2 j TAX
( w- s, Q& P8 G PLA# ?0 b9 R7 C+ U; z* c0 w
/ K" A8 @* l- Z- G2 ?
return:
% i* m5 l  J8 U, k9 Z+ O( y RTS
" o% f5 N9 p, Q
% ?' z2 n% P; B' M7 k4 }* Aora_data:   ;按键相或数据
2 _- X% n1 ^. X/ p. {/ q2 \- O .BYTE $08,$04,$02,$01,$80,$40,$20,$101 h4 r7 ~( ^: p6 V
and_data:   ;按键相与数据4 s3 W5 n& A: o$ u
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
# a7 T4 k5 t% `6 a3 c6 g
- Z# K& J8 j" j, x: X: F2 u 2 k; p0 a2 X' `" L6 V
  s" I" `/ b4 h' A! x. P4 W
;FC数据搬移程序 BY FlameCyclone
6 s) p' Q0 t+ Y. A1 T) D4 a* v/ s .ORG $82008 @) A5 B8 ^- ^  Y( |* q
JMP DATA_COPY_PROTECT! ^( ?; A7 o  e8 J
5 g7 z  }1 M5 L: o6 ~' G5 {
ADDR_DATA_TO = $40    ;目的地址
6 x# d; E2 d2 rADDR_FROM_START = $42    ;源开始地址
( l* f3 o# K6 A+ T* b5 R% X' G% NADDR_FROM_END = $44    ;源结束地址, i1 e: Y! [" X; n) c; u7 ~4 r

6 I& F; ]1 ?3 u% lADDR_TO:    ;目的地址( d4 x, |& Q6 X6 R
.BYTE $00,$70
6 y6 }; U9 C) A6 XADDR_BEGIN:    ;源开始地址
) Y! Z) \& N1 ]* M. x( v/ ` .BYTE $00,$83
6 w& s5 K. u6 g* N, I8 x7 hADDR_END:    ;源结束地址
, R7 t3 F' B. U/ K; t% [/ @ .BYTE $FE,$84
3 n1 }* h" p. ?7 H. f/ x+ K( L) k+ s  u
INT_ADDR = $08    ;中断地址
/ q; p: U3 r# d5 qFLAG_OVER = $71FF    ;完成标志2 z+ C* }0 v) h# `- A# z

6 b4 a7 i% \/ C8 ?. a% C; A- d" b# y3 ]8 W
DATA_COPY_PROTECT:    ;保护数据
  Z3 I  _  Q7 S5 i PHP
7 P  w/ M& O! [5 [5 g PHA8 L- Q% J( ~' }2 d( I# }- w
TXA
" z! R8 u( {# L0 @1 l2 y4 Z0 N PHA2 `$ B# s# s  D2 E9 Y
TYA
' ]8 d+ R6 u# z2 o% \+ T4 l PHA
! q8 B5 @2 }$ S1 ?4 L5 j LDA ADDR_DATA_TO
1 \  Z( E2 ?: K5 {9 {, [8 n PHA7 \$ H, O( U  J
LDA ADDR_DATA_TO+19 i2 M, o1 c) V7 M1 Z- v
PHA
8 n- N+ Q7 X& T, S" A" v LDA ADDR_FROM_START( U+ g( m$ d- J2 G% t9 P) g7 C
PHA
0 D4 s4 H! r+ b1 |+ H5 U! n9 ? LDA ADDR_FROM_START+1
2 l! h2 V$ t! f/ y3 Q* z- C PHA3 p) L  e7 `1 X3 l  _% f% j, D9 K
LDA ADDR_FROM_END/ G! [# A8 Z( L0 C+ W
PHA
0 T" |: j. x& c" F  X# d4 W1 W/ @ LDA ADDR_FROM_END+13 r$ J  ]8 L  U8 G% o8 i8 |, W
PHA
/ s% V" ^! q/ _; y% a
: L- ?! k  F/ ]3 y3 ~+ Q6 e" V) cOFF_INT:   ;屏蔽中断/ k4 {+ B5 n6 S1 s$ |, q: K
LDA INT_ADDR, C/ l3 d3 X' l6 L  u
AND #$7F
, m+ B1 Q& p' K4 v STA $2000    ;屏蔽中断( ?: @* }, w# R4 f

: A; k9 @& ^6 E
9 U* e6 B; W! X# WSET_DATA_ADDR_START:    ;设置复制起始地址$ a, K& k# Y) b; m$ w/ ^
LDA ADDR_BEGIN* @' y% w" }8 K/ o
STA ADDR_FROM_START    ;设置复制起始地址低位
( ~! W5 N7 M' y! ]) q' g# { LDA ADDR_BEGIN+1
3 f+ r7 N. J# M7 F STA ADDR_FROM_START+1    ;设置复制起始地址高位" g9 U" m6 p2 Y  G! w) d" L

* \8 D" a% ^. L  xSET_DATA_ADDR_END:    ;设置复制结束地址
% Z4 Q5 ]' a" H LDA ADDR_END" v* d, V3 \* L7 o4 C
STA ADDR_FROM_END    ;设置复制结束地址低位/ ~0 w$ o* F; A2 F) S
LDA ADDR_END+1, u# z3 m+ o4 M, m3 d
STA ADDR_FROM_END+1    ;设置复制结束地址高位* \' q3 g4 D1 S) ]4 H

# x/ r' e/ e& vSET_DATA_COPY_START:   ;设置目的起始地址' q# q0 {+ [2 r; e5 c
LDA ADDR_TO, v- Y: L5 o( @. R* \  e' B
STA ADDR_DATA_TO   ;设置目的起始地址低位% F6 F! N9 P4 x1 m: h, r
LDA ADDR_TO+19 A3 v5 E% j8 s( d! l
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
$ i6 F$ _7 p$ h6 I
" n1 }, l$ o, Q. S6 vOVER_COPY_CMP:    ;复制完成比较) b( p( W" ^* E9 E
LDA FLAG_OVER3 |1 o$ m6 z- V* O. g( H) j. S' j
CMP #$FE    ;复制完成标志比较* @$ k% D( f- W+ x( p' p
BEQ DATA_COPY_EXACT
* H  K9 A4 K; G  P  y% A  w( r. B
/ l- y$ y2 X+ y! }INI_XY_COUNT:   ;计数器初始化: y: v" Z1 N6 f. o1 |
LDX #$000 _- V7 W4 y' E: A  v4 z5 p  g/ f
LDY #$00
. P8 _3 s) B+ p9 q5 U/ K$ O
" J$ b. t* Z0 s7 ?2 ]4 M2 UCOPY_OVER_CMP:    ;地址比较5 }/ ]' Q8 l- l- n5 T0 U
LDA ADDR_FROM_START. `- J& I, N1 D0 D3 B
CMP ADDR_FROM_END
: m% B. L5 a+ O+ u' a' x2 v BNE COPY_START0 C+ x0 q; j2 W6 |6 q
LDA ADDR_FROM_START+1
. O5 k" D$ F$ l$ ^( A3 h% u CMP ADDR_FROM_END+1
$ @( k# }0 |! [" D( } BEQ COPY_OVER$ x9 x/ k# Q! u9 X  q

0 u; c% {' D5 b8 R) P0 U+ sCOPY_START:    ;数据复制开始" |7 Y& F$ O% o( p( F8 D! m
LDA (ADDR_FROM_START),Y    ;读取源地址! k5 [7 I  W! Z5 H
STA (ADDR_DATA_TO),Y    ;写入目的地址
% P2 w9 L5 b8 N  O8 s9 C  @ INC ADDR_FROM_START   ;源地址低位递增
+ K/ j# I. J7 {) c4 N; @9 L0 S6 Q INC ADDR_DATA_TO   ;目的地址低位递增' p  I  D/ M2 H: L
BNE COPY_JMP
7 H' O  j: H6 c% d  K1 }! N INC ADDR_FROM_START+1   ;源地址高位递增
: @9 o4 z7 S- A INC ADDR_DATA_TO+1   ;目的地址高位递增
0 K" y9 h8 ^9 O( \" s& @+ S3 [! W: J 9 N8 j% }) z' l9 E4 E
COPY_JMP:    : |5 d% R/ `+ \0 a+ ~. F; v
JMP COPY_OVER_CMP; [  o8 r( J( u; A9 f$ L! S
, e. ]7 Q0 O% l6 {2 K
COPY_OVER:    ;复制完成
8 Y, k4 D4 D5 e3 N LDA #$FE. p2 H+ X3 g$ R: A
STA FLAG_OVER    ;写入完成标志2 q' y% p% @& L% R. u
FINAL_BYTE:. m8 f& k% `% U5 l( L: z  t
LDA (ADDR_FROM_START),Y    ;读取最后一个字节) j/ v( ?* c5 E( k+ A  _
STA (ADDR_DATA_TO),Y    ;写入最后一个字节" J' F- e& f9 A) I7 m1 K& V6 z" ~6 j' `% R
/ U+ p7 I# ]! j* ]% L1 C. i" g
DATA_COPY_EXACT:    ;恢复数据
& N6 U' W9 K) G0 D LDA INT_ADDR
9 c4 L% O6 i6 Q% a: E4 l1 o6 i STA $2000    ;恢复中断
) L* K$ t3 f$ p5 I6 p- `! j& u: H PLA9 \6 P7 J7 t5 L6 h3 y+ D1 D. O
STA ADDR_FROM_END+1" U: M( o8 D/ i; M, h4 O
PLA
+ y0 F& {9 A9 v* ~9 L STA ADDR_FROM_END3 z# d/ b" n& _, O5 g" V6 Q
PLA9 l1 H2 a$ G" X* p
STA ADDR_FROM_START+1
* c. \3 f6 Q' k. Z PLA
+ i# A" `8 q2 N7 u: U% k: A STA ADDR_FROM_START
8 I9 i3 ?* w$ {4 T' z* u0 X& ~/ R PLA
& |4 D3 b7 @+ h! z7 g STA ADDR_DATA_TO+14 o9 X( N4 O& n8 V6 U
PLA( C  c, p3 l9 S( l7 j( W( I
STA ADDR_DATA_TO
& ^+ C% i* R' U; J2 R9 ] PLA+ \% V3 q, E2 s  @7 i/ }! n' R
TAY6 F3 {8 |7 ?& \8 \; K' V1 v+ M
PLA
" n0 T6 W1 Y: S& N# I TAX
  z' u  Z& Y* w/ C9 d7 L9 q* i: o PLA
; o1 f: r8 S) ?/ O# K/ h% z PLP. y* X6 y5 n2 m" {# \6 V

( F) V% D# [* ]1 z * N, u: V3 y4 |% x5 N9 r% \) z% y% E

1 J5 L. A# O+ D6 yDATA_COPY_RETURN:
( T( r' n' q; s. F6 d* F3 r RTS
# e5 w( `& Q7 k% N7 o6 V/ S
7 C3 c- {6 r4 r! {* Z+ K/ s9 R .ORG $C056    ;精灵指令覆盖  k5 d) C. o, J3 D/ e* @6 @
JSR $FFB5# l% ?* v! O/ {1 D/ L  J$ ?

, {$ z/ @* ~: b: r% n .ORG $FFB5    ;7 i9 K5 @) B$ T& c$ d: ]
PHA1 U5 R& ~8 ^% y' `
  TXA/ X% J4 D. T9 f2 F6 {
PHA9 e# f+ ~" ~2 E. D) Z' o: T7 r
TYA
. }$ G5 E9 R# b7 M' w/ e PHA
% d3 v' l0 ~+ k6 E: [' r LDA $71FF    ;比较7000-71FE数据是否完成复制( r) R' o) l) }$ H% l
CMP #$FE% [5 F; W) _1 k( [
BNE ADDR_FFCA' {' U: D7 T- e+ M
PLA2 Q5 l* d8 u& O2 v2 v: N
TAY0 k) n0 M7 Q# U
PLA6 i& d0 w1 |4 K- ]* b$ O
TAX. E9 A! _4 o* M4 E- ]; \8 b; \2 g
PLA
' p* O7 X5 @  Q9 i: e$ w1 d6 |& l JSR $7000   ;跳转到自写程序$ R1 _$ ?" L* p0 V4 T  ^) x3 B
RTS7 I; J& N% n5 d
ADDR_FFCA:1 d" \0 F1 m# P
PLA4 d( \7 i: m5 I2 a( W1 W* ^8 P
TAY
  b- U8 U+ X% e/ P  d PLA
, T5 F7 Z7 u/ ^ TAX$ c: z- B- R# F: E8 i! K
PLA7 M* z7 S" b; s4 N8 S, f" K
RTS
' X6 j3 D& \+ s6 g' g7 _% k; o
" k" o3 a7 w$ F
( e1 i& Z" [0 H/ s0 F- b6 e
4 {9 X) l% y, G; R' v .ORG $C264    ;自定义的MAPPER2切页程序  |6 C, I5 z: i& a
PHA3 e0 o) @& `- J2 b% K7 s# i3 @
TXA
7 c" P5 S; @" D/ P! E PHA
2 S8 d0 @$ h9 i( x! Y LDA $0066
3 n- G; A0 U* h* B7 o BNE ADDRC280
1 e* \2 M2 j$ ?3 D0 W: c1 C! F/ K LDA #$07
0 V% J* ]0 R9 J9 C1 C# d LDX #$03( O( a' B; |* R) t2 U$ J, ]8 s& k  u2 `
JSR $CD9B    ;自带的切bank方法
, q2 B* T2 h, q; g3 r PLA
5 K' C) S' F+ ]0 w* f: F8 t5 e TAX
6 D- R* [3 K2 Y# B PLA
& {2 |! g1 V% d; K/ h JSR $8000
+ T" w: A1 F: F7 ^3 ^. J/ z8 \( B; ?1 g LDA #$06
8 o9 ^; o5 z4 H) P LDX #$03' D( n2 F" q. y+ u
JSR $CD9B    ;切回原该切得bank(可以不用)8 f7 x& x3 G" Y( B4 p/ N, X
RTS
7 Z5 h( t. R/ NADDRC280:: @, T3 h' B6 K1 X1 ]0 w, `
PLA
- j0 z2 N: A8 W, h  Q TAX, ^- d( t1 M. r2 E7 U
PLA
$ `2 ?  n5 u* \9 B$ S RTS6 e) |. [0 a% e/ Y2 O: y0 y3 _- d

: e. U+ M" K" j' Y. h
& |; @5 f! X$ ~- o, N;[FC][最终任务PPU][END]7 i; [4 B# m9 ]: h' Z
.ORG $C056    ;跳转到PPU重写程序
& w6 [7 x3 `. N# w% u JSR $7000; c' B$ @  z2 ]

  v% t! ]* b& D .ORG $CEBF
& D, o2 t. l" C" T* p" x JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
, T# I  @' ]2 I9 Q' f: k" W. W  ( A6 ]" b: U! `5 J8 x# U
  .ORG $E460
/ u7 v' d1 G  B3 k  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入& O2 f# o' U/ X# q2 F3 {, F
  0 [9 i# I$ W/ Z0 n1 K
.ORG $71F0
* J* _1 O$ B2 e2 c8 |STAGE_DATA_WRITE:
) g; c: ]# g+ H: Z  H  LDA $6010% }- p2 H) O3 R3 F
  STA $1E    ;关卡写入
8 K$ |; J( C( x* W3 V  LDA #$00
/ z% [! {* P7 o6 T8 J8 X4 r  RTS
/ y" m' i: ]. o .ORG $71C0
  N6 ~  p, k: U+ KBULLET_DATA_WRITE:    ;副武器数据写入
, R3 g" ]2 ^) p( W0 `: Q" q' F CPX #$0E4 y( V  U$ b: [
BCS P2_BUL
9 B3 G7 y2 K7 }1 aP1_BUL:9 S% F, K/ ^1 x
LDA $6004
' _6 Z2 ^, [, w( G JSR $D7D0    ;P1副武器数据写入
6 L! ?, M- I' \- a4 _8 J RTS# |5 l0 I7 B! F- U6 Q7 r
P2_BUL:9 g8 \: m! y8 B, S
LDA $6005; d( W1 S9 F% \% b6 a
JSR $D7D0    ;P2副武器数据写入. L/ G/ B  L+ G1 U- J  p/ [
RTS5 Q+ I8 ^; f4 e7 p7 p! R# D
* z$ A4 {0 a& S. S
. G: ~7 h( m6 J5 X  w4 s3 D) n0 F
.ORG $70006 K2 H- k2 R/ L% y' [5 [, Y; |
  
0 P  R7 j! v2 N5 X/ l( G STY $4014    ;补上覆盖的精灵写入指令2 q, c' i$ W  e% |) w
PHA
; a8 a' u& V& z  W  }7 ?5 e6 i$ @ TXA
; H9 q; n7 s) N- A" e6 x' ~ PHA
! _! n1 [+ L- \4 H5 X( \ TYA+ v3 ], P+ a% X+ B& m) P+ k
PHA
( K1 d# H$ n$ q' u$ f; n LDA $0C
# r* @( X$ }( \% j6 @ CMP #$01    ;比较是否为标题画面
. ?+ z0 S% _" k( c3 g BEQ PPU_STAGE
' S/ r7 w% x, U PLA
) R* S; W; Q. D9 t1 S TAY4 c- [# Z, T" f2 b- d. m' }
PLA
$ [5 Q& E, ?& E" y: S TAX
( S, E% B6 \$ F: n( Y4 O4 H, C PLA
3 l' c8 c1 C" r9 q0 c8 p RTS
! S: e$ J9 \0 }$ D. m9 K" [PPU_STAGE:    ;STAGE显示程序% f0 h& ^/ E, D* H- b. C
LDA PPU_ADDR_DATA
- O" l' M: t. q# k7 f' ~2 l) f STA $2006
3 J5 Z% S# d$ s6 {9 h# s( h  W/ I LDA PPU_ADDR_DATA+1
/ h! W/ T! V5 B$ a; @2 n STA $2006    ;坐标设置
6 J- v2 d3 A- R LDX #$00- z; [% Q% e; `' y% p( w
PPU_STAGE_WROTE:    ;写入STAGE字模' u+ r" Y* e- G5 t4 z3 Z: h
LDA STAGE_DATA,X% ?# H2 A' D* U( A* w! X
STA $2007! c: p' a) @( e6 V& c) u
INX/ @0 l$ n7 g3 u
CPX #$064 C1 H, V* d/ R
BCC PPU_STAGE_WROTE7 d+ S! S& x+ {- v9 {9 U3 k7 `! V: F
LDA $6010  Q! p4 E4 ?) e% Q& _
CMP #$FF    ;关卡数据初始化条件判断
) M. k* Y4 ~$ D  M% I- d  Z BNE KEY_B
* P; A; `+ U# y. E LDA #$00/ m" w) M1 }( G1 z
STA $6010    ;关卡数据初始化' i, v9 M  ~: A8 m
KEY_B:    ;关卡减少
, E% k- F- W2 | LDA $04
" {8 S1 d3 [9 |4 N+ u AND #$42    ;按键B或左减关& `! _$ R* z6 c0 [) z2 h
BEQ KEY_A
! c7 S3 Z3 A4 k# `2 Q3 s+ d LDA $60104 c' @$ G- K2 s" p8 j1 @" e
CMP #$00    ;关卡比较
7 G# p6 u. G* g BEQ KEY_A
1 e& T( X: z- ~& n1 {7 V DEC $6010   ;减关- k6 H0 g! V( T' q0 b( m
KEY_A:    ;关卡增加3 j: x; f6 {% d% X! t5 G- O
LDA $04
7 G  z/ ^1 E+ ~; S4 ` AND #$81    ;按键A或右加关
% c+ }" ~! Q8 _  a* M( o BEQ PPU_NUM_WRITE
1 `1 U9 b  |8 @0 m: t  Z: ^ LDA $6010+ j9 H1 ~$ ?: @: l
CMP #$04    ;关卡比较
+ X" J1 P: |$ g* P, e2 y1 Q BEQ PPU_NUM_WRITE
7 o$ a# f5 O1 G' }/ h" ?& H7 k INC $6010    ;加关
4 W, @; J: O; w# [! jPPU_NUM_WRITE:1 m" ?! s# B( N5 {( _; f
LDA $6010
9 ?" v; l3 G. f& o0 c1 i, X. U TAX2 P/ A6 C; x; r$ P) H$ N
LDA STAGE_NUM,X    ;写入数字
$ b; h6 m. r: i STA $20070 [( B: ~$ |4 n0 ~0 V  B. X4 [' {
PPU_RTS:& G, u! {% I# H6 }
PLA
# ^. u. a( r4 y TAY
$ n5 C, Q& ?# d; x' T PLA- ]2 x/ J5 c( U2 [4 P
TAX6 j0 n! R' W9 h, K
PLA
5 E9 p2 v! ?3 ~; g; Z RTS
* H* d' f4 ]* e2 ?
! |: U* Y# e1 n. y
  n0 x4 i7 F" m3 zSTAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据
7 M+ y! h1 _) M# b# @ .BYTE $EC,$ED,$DA,$E0,$DE,00
9 b1 B8 K+ W+ FSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
" y- D; p" f& f9 E .BYTE $D1,$D2,$D3,$D4,$D57 F: W1 l/ \0 ^  }( ~4 ^+ |0 m& D

2 o3 i, s0 G3 ]PPU_ADDR_DATA:4 r; [6 R5 Q. m9 x! h! a
.BYTE $23,$0C
- T: |+ B$ V! n# y1 j7 s ; F8 F6 P) E  O5 Z6 }& f% `

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2024-5-20 09:49 , Processed in 1.093750 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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