EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 3 _6 t. f1 z- ?5 p: `/ D5 ~8 G
( [' V6 l) d6 q8 C! U1 Z9 c
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
3 o* i4 [) M9 M& h$ @  Z然而,今天想到一个思路.
# \* t5 R% |0 `. L0 j$ {) m8 J1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.; Z6 n5 j( m1 y8 x3 r; [! c7 s
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE, [  M/ }" B) n) A
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
9 @: }/ z2 s8 t4 f" Y( d& q
8 m- H; }: y4 n- J2 L$ V  W* c( w: H8 ?+ {) h& s4 C
;[FC][最终任务KEY][END]2 _& P# O1 b- j6 P
button = $04    ;单次按键
, M& k  n& J2 f+ B/ p5 D0 \flag = $6000    ;功能开关标志
1 P/ ?4 R6 y$ a/ Bpause = $000E   ;暂停地址
/ P- a' ~# Y& K; I
' e- z# I' v; z! V3 q: d .ORG $8000
4 e% p- V" n. G& ?/ t' f LDY #$08    ;自带的按键程序
6 w: r' p! [% r+ Z, ^' B. F- yADDR8002:. b$ V) {  Z4 y8 ?; b& P  ~; u
LDA $4016,X
! U) j: a4 S7 Z' n1 F0 e; U8 b/ k/ [ LSR5 x2 q' n( X0 C( [! p
ROL $0021# t6 R) b+ Q! o% Z" T7 {( B
LSR' B( L, N" o: b% J: d- a
ROL $0029/ ]' p3 a! j1 a5 s6 S( |# K
DEY7 R3 ^( x5 Q6 |. B1 x, ]
BNE $80025 k2 X. e5 J, }) E
LDA $0021
- P) F  C! i. z: n( _4 l- l ORA $0029
" s* R- g4 o4 `* w; Z9 W STA $0021
' u7 h+ K, b! R( c0 E0 I" h LDA $00206 U# M: b) v: s" X- F; P+ _
AND $0021
6 E, `* q3 f. D3 q7 A STA $0020: C1 @7 ?6 z8 {8 e% {$ B' U. s7 q
LDA $06,X4 g2 k1 \+ A; \1 D! U* ~& Q" n
EOR $0020* x7 ^5 I- w& t/ h; h+ v& u& x& S
AND $0020
+ Y$ F& @4 \, j8 w7 W6 | STA $04,X
/ S2 j$ Z" w  r3 z+ t1 g/ W LDA $0020
) k2 T& N& V  w* R  v/ y- k0 { STA $06,X2 o+ D  Q8 ~9 `
JSR KEY_OPERATE3 \! P5 O7 \; |0 D# s/ V
JSR Function    ;功能调用
7 ^( ~6 d$ ^  Y. D5 f5 t JSR Weapon    ;武器切换调用2 M! s/ s1 i6 d
JSR Power    ;威力调用
9 v& F$ R4 A6 o* \% o# h$ P' [# { JSR BULLET_NUM    ;子弹数目
5 n, Y* H$ N  c7 w4 s, q: Z2 L JSR BULLET    ;副武器类型
1 z+ z' I, D2 Z* ^ RTS
& @0 [/ y* B4 ?# }
* b2 F1 p, }' q4 @' _5 K0 |* J! ^ 7 E  Q6 R& P1 X9 P1 l6 ]

% C+ g: K2 o  ^; e- [ .ORG $80504 W, M1 A' S" q; o5 s
Function:    ;功能5 u9 L# Q7 @8 W' l8 I
WUDI:    ;无敌
5 y4 o$ Q' }$ z/ ~% ~ LDA $6000,X
5 M5 B& W; D  D  b AND #$08    ;开关判断: X6 y- S' w# U5 s
BEQ LIFE5 j& C& j3 C( B
LDA #$05
" h* q6 b! S6 }4 P* Y STA $05DC,X    ;无敌锁定3 j' B# B2 E. I  G
LIFE:    ;生命
5 ?) G3 J' @# u% |: D LDA $6000,X
9 `4 T4 p3 ~( G+ ^3 [( h7 _ AND #$04    ;开关判断
* F  h* k1 P8 V( M3 P BEQ FUNRTS
$ U4 T( i8 c* F* x! C+ x6 U0 e LDA #$05
$ x) @$ B, _) M. }9 Z9 q STA $1C,X    ;生命赋值
7 V% ]" s+ F( D( NFUNRTS:
# o9 I% O: \. E# u2 k5 F) W$ Y RTS
5 w% e0 I& P; \
# D5 C8 h* o  y) L' |1 _- SWeapon:    ;武器切换
9 N9 I2 w# p& ?. m" k LDA pause    ;暂停状态判断
2 d, H- n9 V* n' k BNE WEARTS
  }; }# W, h& f, {4 D/ } LDA $04,X5 w! O, _6 H7 n* p& C% F
CMP #$20    ;选择键判断
0 g7 s- @) ?3 h2 k" u" t4 F BNE WEARTS
9 v5 V+ @- r* w" O0 i LDA $12,X7 Q3 ]. a# f. T, f/ K1 v4 {5 R/ `. O
CMP #$03    ;武器值判断
: k# X" N4 {3 W9 ^  ` BCC WEAINC* s6 R* I2 v" p  c8 l. X+ l5 J) C( h' Y
LDA #$FF
* o" t3 v8 r. d, \) | STA $12,X    ;武器重置
) c4 L- b/ @! `1 g: IWEAINC:
0 r  g8 a3 H3 |: C+ S4 ]7 R+ {$ t& W INC $12,X    ;武器增加
& X7 \% ?, S; p0 {) m 1 W4 {$ \3 r+ j. K6 w* Q' l; f
WEARTS:
+ V1 F9 k5 M% ]0 |, l/ O RTS
% q6 t& m' B: Y/ A1 o- y( M2 |
3 e/ m4 d" J0 [+ {: p3 R( O6 ?Power:    ;威力
- ~/ ]) j9 F8 T7 I+ F& ^ LDA pause    ;暂停状态判断: m# u9 Z9 P; Z* [
BEQ SPERTS* a6 N# i& A. Z# L9 t
BUT_LEFT:) d4 |9 y: x8 v" P# h/ k) b
LDA $04,X! t) i; r8 ?5 z/ O$ A1 G5 t2 i, J6 y
CMP #$02    ;左按键判断, G! ~9 g- ~) a1 F- b  ~
BNE BUT_RIGHT
% H; k; T0 O. ], a4 p5 |7 o) F" V LDA $88,X, c1 `- x& |' ~) l$ [% a
CMP #$00    ;威力判断6 G# [5 N" b$ R$ J. b
BEQ SPERTS+ k( v, P$ Q5 T  h
SPEDEC* g4 z! B/ e, d) b( g  D# x4 _
LDA $88,X    ;读取武器值
7 i( k1 w2 B7 { SEC
# s8 Y  V3 P( E4 {7 E0 j% K SBC #$08; U; e* L3 x! R( w5 `. \. p
STA $88,X    ;威力减小
6 k/ C2 ?- G8 s. ?BUT_RIGHT:
% \: [2 E/ {2 ~ LDA $04,X
5 b+ T: S, G7 C) T2 q) G5 f- O8 ~ CMP #$01    ;右按键判断. c: ^& Z( N6 e
BNE SPERTS" D5 M5 o$ b5 \" T* @
LDA $88,X
$ A, J3 V; Q2 a3 v& ? CMP #$10    ;威力判断+ D! `1 \# w" T1 g
BEQ SPERTS$ n  r4 W8 ^8 z! d& b* j3 |' K9 t: G/ x0 q
SPEINC:
$ e; e; x" D6 A# ?9 w. _ LDA $88,X    ;读取武器值- S; n! D$ |/ h. T
CLC
6 z1 Z7 u/ I6 p9 `" C- k6 Y ADC #$08
& p! e9 F: _1 [9 z STA $88,X    ;威力增大4 |8 c$ @1 h6 r+ h

, D4 ?: B& @  c5 m# _SPERTS:
/ }. t8 H8 a$ S, P1 v RTS
) P3 j0 x4 D& m; o8 u! p$ I& T( J$ H4 C
BULLET_NUM:    ;子弹数目) t8 a  A" w) r1 h$ F$ W  O
LDA pause    ;暂停状态判断
0 p  `, t, E4 _/ o BEQ BULRTS  S! a5 {5 m5 N& K
CPX #$00    ;主机玩家判断& v: h0 c  O; F" E1 U  g9 s3 D4 B- c
BNE BULRTS# @. U$ N* B: r' P+ H3 h: c2 I
LDA $04,X    ;主机玩家判断( x4 M; x. j& V) a. M6 H+ }
AND #$80    ;按键A比较
) P3 J' P! r# E" E0 Q( F BEQ BULRTS
6 E  W  v( g% w LDA $87    ;状态判断
$ s: W3 R: M( H5 J8 y BEQ BUL_2
* S5 H( M; Y# S' ]' f: s, RBUL_1:: D# p; R, H% T" P0 \+ U
LDA #$001 z/ W& A' z; K" X
STA $87    ;1发子弹+ R0 g+ F& B) }* \8 B3 |
BEQ BULRTS
5 `; v- X/ V; d& x6 ]BUL_2:  v& j# D5 Y: S# c
LDA #$012 U# U$ F5 w/ c8 E& e0 ~
STA $87    ;2发子弹; P. A9 e7 E% n3 J7 Z

2 b; w2 B, K! l; [) r$ Z! PBULRTS:: q9 P% {8 a: d7 n) D3 [
RTS
/ }4 ~7 B! r' J: n' E# j9 ?! P ( p/ |, C/ C4 N/ k9 k8 f( q8 h0 \- a

, N! m6 z$ x1 q  G" ?4 m3 f! JBULLET:
) f9 @2 ^; [" `) d LDA pause    ;判断暂停状态+ p- W& J; D; M' L# H
BEQ BULLETRTS) U% p2 x% @6 D4 q# f4 d5 P( ]
LDA $04,X- C: f9 V7 N* E# z* S' |
CMP #$40    ;按键B比较9 _4 ?" k3 c' `: f1 c, C3 o. p6 Q
BNE BULLETRTS, m' d7 u0 V# R5 C
LDA $6002,X    ;读取副武器
2 P4 M# u* z8 V, |: C CMP #$03
" M3 A" X0 d1 c BCC BULLETADD$ H+ @  P( N; {- t3 _
LDA #$FF
" t( v  {! g6 W STA $6002,X8 w. N1 P1 t! f# [& G
BULLETADD:3 \- E% ?  G  N& U; ^9 b
INC $6002,X5 |  I. P' y: q% w1 h  s) ^
" v0 t, R2 Y( q; n  A- ^
BULLETRTS:  X7 \, |1 z, E+ ]) z
LDA $6002,X3 j0 c" c$ }% k. R. ?; H6 F
TAY
/ z) }: U5 S: a6 X( k LDA BULLET_DATA,Y
: s( y( Y* \2 k5 U/ n4 ^ STA $6004,X    ;写入副武器数据4 w0 H8 D% u6 B+ X& ^! i
RTS0 N& l0 Y% Z1 U/ r9 l& S
2 k+ o4 `6 |9 ^) K+ _' Q2 x

* p% U% H6 f- F* ]8 d, R+ o; yBULLET_DATA:
( \6 L, {" E; u1 ]7 N3 d .BYTE $06,$02,$03,$04
, n1 c* H; N5 l, |0 G' P + l( \8 Y2 e3 h3 q! d9 \! E

2 M+ p! b/ h6 j7 o 2 ^% _1 K& B3 X* V0 C4 @
KEY_OPERATE:    ;按键开关操作
- ?: J9 A2 Y7 Cdata_protect:    ;数据保护
1 y& m  H9 N$ \/ y8 \ PHA" C/ e5 p" t5 V, S+ B. U
TXA/ Z' M5 H/ L/ D
PHA
. G* L; i% t/ _ TYA
9 @, X5 F; N1 u PHA! M/ u3 |# x! J* W  D
& W% f3 D3 x% E4 d
FLAG_INI:    ;开关标志初始化
' B+ T6 X7 E0 W& J* U
) ?$ M7 O5 H( [ LDA $600F) M. L  n# s" r2 x* V* [# K
CMP #$01
. S' C5 X' D* y( K2 O# Q1 s BEQ pause_cmp. K' A/ q2 ?, S9 c4 C
LDA #$00
7 @; U% h. \6 h8 y, ` STA $6000
5 v) @! ^/ t4 Q8 ^* `) i- @$ P STA $6001
1 u/ p0 `# ~+ L0 [ STA $6002
* C$ _8 w. E& H STA $6003
  o7 f# U4 L6 l4 D2 V4 U) ?% I  L STA $60042 j7 D0 B  ~  _8 ?8 i3 c
STA $6005% t( W/ D1 r4 X2 @# h* I" m
LDA #$01
+ ~5 a# z5 I) }& h: ]0 y( ]: s3 B: `: | STA $600F
5 Z9 s1 N% t, x% B" j* G ) L" @  J- |  V5 Y; _7 U- h* M
pause_cmp:    ;判断暂停状态
; n' X4 @8 l3 G8 g- f8 C: t6 } LDA pause
- [, ~4 e% ^# [& B, p$ C CMP #$01    ;判断暂停状态" R% l( l" a! ^; e( s
BEQ button_press
0 u% |# H: Y  b' j, @! s PLA
& Z6 F9 q; c5 |" S: r' ~4 o8 H# O TAY
' I) n( D: ~7 o6 S PLA' I6 D; S7 i, u0 m7 y
TAX
2 n; ]) p/ I* ^: B- G1 E PLA
6 M' `, _. E4 Q% @$ X4 l RTS  S3 ]; d2 `0 k. U2 M7 Z) P) i

8 S7 n( K4 |' G2 Lbutton_press:    ;按压操作) c* m% ^# ^4 J) |
ini_Y:% t5 ~  f" E2 V( ^
LDY #$00
; ?, a3 A1 W3 Tbutton_cmp:
. H: i. r* H( k; a) f- f5 x% x& Q LDA button,X" E( R4 W9 m4 Z" W# ~# R
CMP ora_data,Y: [. ?! U4 @4 x0 h! s/ m) i
BNE count_Y_cmp( P. M( V5 P  J3 I1 p  l- G2 k
flag_cmp:; _( c' A0 r% B3 j/ ]" h& _
LDA flag,X  ?. s+ _6 j; s9 b2 D6 O8 J
AND ora_data,Y
: ~, \0 G! }) D" x4 M+ W+ G BNE flag_and1 O( V; W' }6 v/ g1 C* K$ _/ i
flag_ora:0 P+ `; o- z& v
LDA flag,X% O. Y+ B: k3 h% l; R3 E% p# G7 v
ORA ora_data,Y
1 y& D* N$ x: f  a/ }0 C STA flag,X
: x0 z  }. L4 k6 \0 ]* u- F8 E BNE count_Y_cmp. J$ P# n# H0 G. ?' o
flag_and:
& _1 y- J/ a( B. y8 V8 H LDA flag,X
! ]( Y3 z% E- r% A AND and_data,Y& O% M3 c" R7 l( _3 ^
STA flag,X/ V0 K. u( Z1 v
count_Y_cmp:
, n8 S6 {7 e/ R, ] INY/ n5 O/ n% Z! H9 |& |* Y* _
CPY #$08
( m! c% n4 k4 H; p7 \8 g) z2 z: { BCC button_cmp8 @! b/ B3 r8 I9 C
' l2 n" J2 n: s+ c* D7 x
data_extract:    ;数据恢复0 {6 i; O# q0 W1 @8 N
PLA: Z5 N. L9 d0 N6 }
TAY
/ q8 s9 W+ ?$ @* |8 u PLA; D  ~: M1 ]0 w% v# W
TAX
/ w; K$ m1 O  z# i% T3 z PLA( G* t/ n) n( f* a7 _+ L) ~
) D4 d6 j8 w5 X% @; @
return:/ R: m% m( P2 g/ E+ I- M& q0 Z
RTS
" z& o7 {. l# [$ J" {) y8 i : y) m0 E+ v$ N  g% S+ `- u% H
ora_data:   ;按键相或数据6 w0 M: J/ |7 o7 h. B' w
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
  S5 R4 ?$ ]4 U5 @6 Mand_data:   ;按键相与数据2 X0 A8 e, R- a1 ~" M% M+ U7 H
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
4 z% @9 ]; O2 b. P/ [ * g* T9 p; h% z/ v* ]1 D4 p
5 {/ M0 d* O; I& F, f& M2 P
$ X$ U( p4 j: e& O& d  v2 }
;FC数据搬移程序 BY FlameCyclone% K5 h9 P, ~0 P0 N& w
.ORG $8200
% \7 [6 t6 B5 B$ D# z& ]: i7 ^ JMP DATA_COPY_PROTECT2 F( ~' ]2 Y0 ]. \/ |

5 i1 j3 K' I7 |! |$ FADDR_DATA_TO = $40    ;目的地址
5 f# o* L7 [: v7 o" YADDR_FROM_START = $42    ;源开始地址
6 w- S# U  C' k8 lADDR_FROM_END = $44    ;源结束地址
6 H! R3 j0 r' Z! p: i* e+ k: G+ C' {7 m: G+ x/ w
ADDR_TO:    ;目的地址
4 @/ p% Z  b4 Z5 d, }3 T: I .BYTE $00,$709 ~' i) e: c3 q8 l& C. e- _8 f$ v
ADDR_BEGIN:    ;源开始地址! F! @6 ]. d7 \; D3 s5 r8 |
.BYTE $00,$83
  E( K3 s. }7 \* ~5 x1 v3 r6 NADDR_END:    ;源结束地址
; O% |, ]* q- ?7 ]1 |% F .BYTE $FE,$84: H" O2 M/ {; y

: E2 }1 l9 D+ ^6 j  {, M2 qINT_ADDR = $08    ;中断地址+ T( o8 R$ V0 }1 L
FLAG_OVER = $71FF    ;完成标志9 o9 R7 P% h1 [  N4 l1 `+ T

- j5 }$ G3 \( g% h
# ~* \& y$ I8 ?DATA_COPY_PROTECT:    ;保护数据
1 M; y% @6 J9 Z! f0 c. q: t3 M PHP
4 ~' }0 |; K: z7 a% N/ D) }+ [! D PHA- B( I/ r4 b) ]) |' ~" P6 i
TXA+ n  ]9 n* Z0 p  O$ `  w# W9 M
PHA" \  N8 o+ U: z, c% a( _
TYA: N0 j' L' T) u8 |5 e1 h6 p! J
PHA; y& g  K6 `; o9 L0 S2 v' }
LDA ADDR_DATA_TO8 |/ B% ~4 m" Q+ ]
PHA4 R6 |# h9 x: C  o, v7 p
LDA ADDR_DATA_TO+1
4 u/ H. D+ L0 } PHA
6 V; f. S% m' O: ]* R LDA ADDR_FROM_START
4 ~8 B2 J3 |  {' F& l  G8 O( }" P PHA* H' _' j' N) s0 n5 H
LDA ADDR_FROM_START+1
' T6 g( s2 p' l: r/ {) `5 r& y PHA# d" J* W% }: |% ]  [
LDA ADDR_FROM_END
: x9 V% H6 q. {( g6 F0 x PHA
% ]" s  ?% C9 @1 P LDA ADDR_FROM_END+1
/ S: g1 c- E% `7 ~6 w PHA
* `9 c, d9 \, d  I' h2 H0 N2 x4 U
  ^; s' j! C8 ~8 COFF_INT:   ;屏蔽中断# ~  F) t4 d6 q0 J' d7 U- v- M
LDA INT_ADDR  Z! U$ U% A2 V& U) \+ i8 t1 ?$ l  u
AND #$7F. ~: @1 u3 ]7 _* Y* j! _8 C
STA $2000    ;屏蔽中断
/ R2 p6 a( _! ]' ]. g
0 m1 Z* k; a3 s: [* S
- b! f6 U6 [) d- ?SET_DATA_ADDR_START:    ;设置复制起始地址
! @$ h6 _  i" [/ g LDA ADDR_BEGIN
/ C; @. [4 }4 ^9 a; P, G! r' Y STA ADDR_FROM_START    ;设置复制起始地址低位4 m$ t- d+ N" u9 |
LDA ADDR_BEGIN+14 ~0 U( Z1 y8 @2 a( r+ ^3 E* ]
STA ADDR_FROM_START+1    ;设置复制起始地址高位5 @$ |, D( y) [- }
$ R& Z1 y/ \1 j( W2 S1 f# Y1 T+ b
SET_DATA_ADDR_END:    ;设置复制结束地址) b" N# q, x% f
LDA ADDR_END
# [5 Z' L, Y4 r2 ?5 l* Y STA ADDR_FROM_END    ;设置复制结束地址低位  U3 M' x8 b7 J6 q# _$ P
LDA ADDR_END+1' E; T6 h9 ^% \! {1 n
STA ADDR_FROM_END+1    ;设置复制结束地址高位# [5 E6 G( N3 o1 H4 j
& u, @; k9 Q+ S) d, g, s1 ^
SET_DATA_COPY_START:   ;设置目的起始地址
3 t/ A5 q5 }- g0 h/ M: I) f3 F LDA ADDR_TO
6 d, W. a% d' _' P/ L% }& ] STA ADDR_DATA_TO   ;设置目的起始地址低位
" c' R: `! D  n4 ?7 F  o% l1 p! a LDA ADDR_TO+19 v- I1 s- K2 O4 I
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
" X& S; g0 ]% [( |
+ |4 v7 `: R, uOVER_COPY_CMP:    ;复制完成比较
1 E, S  @2 z( f! s5 }  Z* @ LDA FLAG_OVER
: v' k9 M  v; c9 c( A  s CMP #$FE    ;复制完成标志比较
- L! `( Z0 s& p6 e6 f2 c8 { BEQ DATA_COPY_EXACT1 c5 ~- |: C4 V2 ?! k6 C& g

2 v) g8 e6 y# W" q2 ?7 Z! }5 c' UINI_XY_COUNT:   ;计数器初始化, H- ]; S0 p6 @$ J  G3 j' l' a
LDX #$007 s) [  ~* D! u% Y' P  k
LDY #$005 {" a6 d, m* G% ~- w. |( C. m

' ]/ w. N  p" N: _5 f" rCOPY_OVER_CMP:    ;地址比较
1 B7 r: o- E. a5 c LDA ADDR_FROM_START. E# F1 p, s0 f+ _1 c/ v8 [# E
CMP ADDR_FROM_END
" L& `8 D/ S$ T4 f/ Y BNE COPY_START! I  @( x$ @( }) m: {
LDA ADDR_FROM_START+1
$ d* T$ a7 j( e( D4 x) N, H. y3 w CMP ADDR_FROM_END+1
3 _2 \) E" W3 Y BEQ COPY_OVER! S% s! {4 K4 \& J

, ?; Q8 N0 \# O( t9 XCOPY_START:    ;数据复制开始+ N. c4 S) u& ~# B3 A4 I/ J1 O
LDA (ADDR_FROM_START),Y    ;读取源地址0 V# ^" V" c1 d3 r6 g
STA (ADDR_DATA_TO),Y    ;写入目的地址. v7 B$ @0 \- Q' _+ w4 L+ n0 P) Z
INC ADDR_FROM_START   ;源地址低位递增, V1 \9 M+ c4 y1 ~
INC ADDR_DATA_TO   ;目的地址低位递增' p4 x( r1 o8 d$ M# q% J
BNE COPY_JMP
- r$ {. V& [: {0 g  h INC ADDR_FROM_START+1   ;源地址高位递增: @/ U2 `% b9 F: b. n
INC ADDR_DATA_TO+1   ;目的地址高位递增
- ?4 s% Z' n* l2 q. u6 I& ~ / R; J5 u8 b) s4 q( o0 |& _5 t
COPY_JMP:   
  g& x' f8 E  }% ]2 g JMP COPY_OVER_CMP
% ]7 _- w7 h6 K/ U
; _/ Z1 ~1 F  N# q; xCOPY_OVER:    ;复制完成
& `) e# h7 C9 r3 R, r; d LDA #$FE1 c* A8 D, O% f& K! K' a) _
STA FLAG_OVER    ;写入完成标志
  _/ G- m4 _+ Z4 E4 o' @FINAL_BYTE:
3 q1 `: c+ {' n# L LDA (ADDR_FROM_START),Y    ;读取最后一个字节+ _. Q/ U* B8 O
STA (ADDR_DATA_TO),Y    ;写入最后一个字节
, w# i. e" k; O3 d' H9 N# }
% ~) h% y! N2 _0 gDATA_COPY_EXACT:    ;恢复数据
! L, `- `6 ], G& N3 ] LDA INT_ADDR
4 W; {! a8 D, z0 U STA $2000    ;恢复中断
. q) o' }( L# z3 c% m3 _$ U PLA  q7 a4 a9 o) l3 Y& v1 m) m2 R
STA ADDR_FROM_END+17 I3 _! {1 X& R. n# |6 ~7 w+ P
PLA
6 s) |; c/ n% V% H( U8 B& D; S& J STA ADDR_FROM_END
+ i5 r4 E& v5 @: h3 t& G8 ]' w( X PLA. U6 }9 n8 |# ^$ {
STA ADDR_FROM_START+16 T: V7 N8 W7 y# I
PLA( V' `# w1 ^. b7 o
STA ADDR_FROM_START
+ ^/ k' d$ a/ W PLA  z! a1 B( [% @! z4 A
STA ADDR_DATA_TO+19 t: }( ^& r! F, f
PLA; c* D- U" `# C& X1 {% z' j$ P
STA ADDR_DATA_TO
1 d2 X! B$ I! b  j6 t( Z PLA
& B7 D7 h0 ~/ I. j* ]3 \# t6 Z( O5 \ TAY, S  u! I7 j6 ]2 s( I
PLA6 h# A: f$ e, t- P
TAX
) H; d$ |3 _6 F) h0 H PLA# \6 I$ x7 v: K9 \3 w0 B0 p
PLP
1 I6 s8 x. i1 v$ v  W; J, T! N3 b4 I
3 d. X8 g& K0 c$ b# X 0 f) W0 J4 J/ ?( B; z1 R" Q8 ]* |

5 u0 H, {$ B6 I* X! w) GDATA_COPY_RETURN:
8 I- d) u: ?* h+ [. A- B RTS
+ q+ l2 j9 P( I+ V7 z& k# G& r 8 T6 y' s  y1 l% O) M
.ORG $C056    ;精灵指令覆盖
: P0 V4 F7 R- s' n9 @, Q JSR $FFB5
0 Y, P8 a0 N+ |$ B3 B* R
- l5 v7 D" {3 ^- s0 G .ORG $FFB5    ;  k" _3 Y# t* ^1 _1 A; ]
PHA, Q" s) p- R0 J, |
  TXA
, L8 I. ], p" w: T5 X0 z PHA
) k% g) I- ?( }& C+ J* y! B TYA
! Q1 @& i0 E$ B% ~' m PHA
* g4 |1 v3 _. R LDA $71FF    ;比较7000-71FE数据是否完成复制8 v, o& _! I% |4 e, k. t
CMP #$FE5 K) [3 P, E' X/ t5 ~+ I& H
BNE ADDR_FFCA2 U/ k  g1 E. N* Y+ A
PLA) b1 r8 k9 p" b" ?. w* A3 r, J
TAY
9 s9 O6 m6 a9 |8 }- e PLA
2 a8 |9 e+ }6 d4 z  b3 L/ u+ | TAX/ s8 E* ]( ?" J+ Y! o  i/ [
PLA; S% e* W' u2 x; [9 ~% R
JSR $7000   ;跳转到自写程序
# ?, l/ F5 x& d8 E$ D7 G' l! L9 ]2 P RTS1 P) {8 H* ~+ j. S2 M9 h+ D
ADDR_FFCA:( m) d0 W+ `# k6 F% {& F8 s; V
PLA/ |( a. T, a% `
TAY5 ]# R9 m) B5 w; l" s3 k# a
PLA
% L& H4 ]2 m) @( V& v/ Y9 o1 F9 z2 E TAX7 H, H) {$ S$ H( @# H, u$ k# D
PLA
/ I2 F- T. \# o RTS9 d5 }& o  q# {" c  E* Y( c
" \; Y; k' N" o

5 r3 a- @0 K2 l% h8 L
; N4 X! G8 X0 f( W; T) _ .ORG $C264    ;自定义的MAPPER2切页程序
4 V  `  M7 }% i1 c: s PHA
) A. B" e6 J) q' o1 r+ L' G  e2 P TXA; u1 L% c& R9 `
PHA# e! A9 j6 a1 t0 [% h
LDA $0066
9 h6 ]- W/ T- K# \1 D; D" v% r# O BNE ADDRC280
( v- {: M5 R. f" z! G LDA #$07
* Z: f: q. c. o2 v% z) c7 B+ G LDX #$03+ Z$ H3 ^) A" B( m: x' `
JSR $CD9B    ;自带的切bank方法
3 r" y& L, |( B* { PLA( n$ P. I. t) m* h4 y
TAX
3 S, D8 \" _' `0 g. f PLA
- w$ }0 V/ P0 }" k; r: q0 W8 { JSR $8000
9 J9 }; L* a* }; ^0 q$ y% q' c7 S LDA #$061 G. ~: s) \# n. G' k
LDX #$03
: O8 V( B" i  ?1 ]# D JSR $CD9B    ;切回原该切得bank(可以不用)9 b  k$ o- \% y0 W' d" ]7 F  |1 H
RTS- w( c( ~, `9 }+ ~2 [
ADDRC280:9 p4 l3 g, B4 L3 [
PLA
: N! @( @; |9 P4 S TAX
! L" f7 g# L' p6 N; F' { PLA
8 ^+ s: x% z4 T$ O1 _& ]5 x5 L& }% ~5 Q0 [ RTS
9 q( [+ w3 _# a) Y0 P- w/ R
3 |8 n+ U. S1 u1 b   j( M# |+ d2 d
;[FC][最终任务PPU][END]
7 h( k( G- y" |0 i" y8 M  N .ORG $C056    ;跳转到PPU重写程序: |. [- G8 C8 ]$ R' p& A
JSR $7000
" k. L' f' J; X& O* j2 m! I% q( J2 n+ L7 s
.ORG $CEBF
4 f) n" ~0 a+ K1 t) c+ G6 o& n JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
( V% y0 N8 p' F1 ?    D8 P' X" A9 @- i; [& x9 ]2 J) W
  .ORG $E460, U( C& K7 O# W' l) L: E5 q
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
+ m' v2 _3 g6 e! O. M5 a3 J  ' n+ V2 \6 Z# x- T6 n9 X( i% x
.ORG $71F02 e/ A% e+ s: o; Q" z4 z; n7 N1 c3 {
STAGE_DATA_WRITE:
% S8 ]) A/ V' m, Y1 ^  LDA $6010
5 b" `" l3 c5 t: i2 i6 {/ L  STA $1E    ;关卡写入' T5 o$ W' p7 r' D' O
  LDA #$005 e1 u  G4 d, Z8 U! B* k, g
  RTS/ F6 I2 m8 Q( E. t1 g4 Y* X
.ORG $71C0+ u, z5 o# s* P' V6 y9 \, i
BULLET_DATA_WRITE:    ;副武器数据写入7 U9 W3 {" _5 x0 i" w" w5 Z& w' A
CPX #$0E/ T3 H( D; ]& ^9 F1 N
BCS P2_BUL
1 A* h2 o! }5 h2 i6 Y7 BP1_BUL:! v  U+ F% M$ {5 @
LDA $6004- l- R2 t" k7 |+ X4 e' H1 X
JSR $D7D0    ;P1副武器数据写入
/ M5 Z9 |/ \9 G" J. W/ W4 ?3 W. e RTS& b# C* O3 n. X. W
P2_BUL:
/ X& o9 J. W& } LDA $6005
* t/ r7 g! e" Y/ m. G8 X JSR $D7D0    ;P2副武器数据写入
! l7 q9 i  V  l1 Q. F2 l) U RTS
0 ~6 |1 N1 w* j8 B/ O# j9 v2 F( Y: m# _0 t
. v2 F  D# b4 r) l# ^6 N
.ORG $7000
& a2 H  m! V1 i& [# r7 Q  0 ?( O! B; N5 y
STY $4014    ;补上覆盖的精灵写入指令8 M& \. c# `8 ?
PHA
" `! S" o  ]2 o7 r+ [* e TXA7 T( \, r. o# v4 r0 ~: s
PHA; M7 {6 l! B5 ?; v' g5 L; r/ r
TYA" C9 H1 b, G- A" ~5 u: g1 c. C9 m
PHA" c7 P- o; Y4 o2 K
LDA $0C! |+ n) n; r0 @8 ^" t
CMP #$01    ;比较是否为标题画面
5 @$ v& h7 U' X. H9 K BEQ PPU_STAGE( D% ~$ g# i2 _  i" M7 ^& }
PLA
% k; s# P* b* L3 O& N* l* h. T TAY
, m* Z6 s4 t( p PLA
% f! o! i- S2 Z  L TAX
. e0 u! J! _7 h$ d5 f! C PLA
8 E5 w6 `% u4 ?+ \' ?4 H+ r: @* @; n, { RTS
1 u/ M9 b4 p3 g- ?: P5 j3 u9 XPPU_STAGE:    ;STAGE显示程序
: c. m: e3 s/ P7 f: { LDA PPU_ADDR_DATA4 [0 U3 V' o% K. {5 v1 w- @
STA $2006
3 X% A, R( z) J: x  t1 a LDA PPU_ADDR_DATA+1# b! H, J" b( P9 G5 j& }
STA $2006    ;坐标设置. s. ^3 `" S0 p7 G
LDX #$00
- d/ ?& U: B$ L' s* ?+ I; v* xPPU_STAGE_WROTE:    ;写入STAGE字模
9 y( w2 w6 C8 i/ a2 X LDA STAGE_DATA,X
) q4 |; d( ?, {5 \" J STA $2007& B0 ^! t8 I$ F; d
INX
( P3 ?8 b6 N, g7 e' p6 ] CPX #$06
) {) }% m2 k  v' M) h BCC PPU_STAGE_WROTE2 R( z+ Y* Z% }( ]
LDA $60102 B- [6 G& V) c- @
CMP #$FF    ;关卡数据初始化条件判断2 i8 v1 ^' q. N+ C: R  R; y
BNE KEY_B
+ }/ a+ N: i+ m7 _3 e6 J LDA #$00, M+ E5 V# @1 p6 P9 `& D
STA $6010    ;关卡数据初始化
; ?0 p6 ]( k% B1 s) o. jKEY_B:    ;关卡减少
* P9 L+ _9 c; I: U LDA $04  T) u  i0 ?. C, D" \1 d
AND #$42    ;按键B或左减关9 x: ]! E+ f! o: b/ q' I
BEQ KEY_A
7 _+ ^; J7 i' E- u0 N0 N$ t LDA $6010+ n2 q" {+ ^) {4 q
CMP #$00    ;关卡比较. {; K' L1 g) U
BEQ KEY_A
+ N/ T0 n1 }8 a9 s/ f DEC $6010   ;减关- I7 ^! a+ t0 {* T5 i- `
KEY_A:    ;关卡增加8 T" v6 X8 b9 J: r1 D4 @6 K2 _- W* n
LDA $04
& P" a  J' R) U  |/ o$ t AND #$81    ;按键A或右加关3 o- F& G) A4 I9 r7 c
BEQ PPU_NUM_WRITE2 @& ]- u) y' Z+ }) ]* ]
LDA $6010+ B: Z4 t9 \' t' G2 L6 M
CMP #$04    ;关卡比较% T% T; [8 z$ H) F) H! ^6 x
BEQ PPU_NUM_WRITE
7 k* E7 ?% C# A9 p5 w1 j INC $6010    ;加关' W& S3 N# O) x3 }
PPU_NUM_WRITE:5 @* N+ G0 }+ w
LDA $6010
( {6 |$ m1 P  R' j- O- Y  O5 ]1 f8 P) z; z TAX
0 \9 H9 m8 G, o' D8 Z) p LDA STAGE_NUM,X    ;写入数字; i" q* N7 M' e3 @
STA $2007
1 l1 @" M3 U& k* `- u5 j5 J9 pPPU_RTS:
- p: l- |: {, I' w9 ?; M! a PLA$ g+ Y1 N3 r4 l" o% g, f7 ]! ^
TAY
* W* U# k' O) X3 u. N PLA
. d" m) @5 a3 N% G+ l! t# s TAX( e/ }: B6 o& G2 K- Y. y& o
PLA% I9 ?7 B& O$ ], m; K
RTS
0 ^; V- O4 m" o# o+ ?/ c + ?$ A+ `& }! m* J5 n% [, |

9 K% d3 Z, C7 l/ XSTAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据9 _) N8 C5 N3 \+ n% `+ \3 h; @
.BYTE $EC,$ED,$DA,$E0,$DE,00
9 V) Z% n3 P5 a9 PSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据+ Y, w8 A3 Q( z% z
.BYTE $D1,$D2,$D3,$D4,$D5/ z% Z/ x9 R) j' U

; ^$ ?# y- v+ [PPU_ADDR_DATA:
0 A3 B! j7 K2 L8 X# B: q) l .BYTE $23,$0C! i6 G. t. [5 P8 `% X
$ Y/ R/ b3 R- ]0 d. P5 q/ i, B

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2025-2-19 05:55 , Processed in 1.131836 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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