EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 % L: N2 L; B- ^2 K+ _2 x, S
9 Z0 _6 C! N/ ?  F6 c% n7 Y
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.3 ^, B$ u1 y; S" N
然而,今天想到一个思路.! h1 q1 g: s4 e' e8 \% Z
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
: Z; E$ ^8 r! j2 u% V2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE7 N6 g! Z: {" k
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).1 S% w# |5 Y' `

& g* U4 l2 L0 P3 Q$ i7 |/ b# ~6 l/ b( M) \) q
;[FC][最终任务KEY][END]6 y  I9 O! [# G( T$ G9 r
button = $04    ;单次按键/ v- _( P. A5 J; ?
flag = $6000    ;功能开关标志* X' p+ p; }% I' F% E
pause = $000E   ;暂停地址
9 u, q9 ~: Q* S0 E% K9 }$ z" i! \" m0 X5 `
.ORG $8000/ B1 V. U$ X% T
LDY #$08    ;自带的按键程序: P6 ?6 R' U8 ^1 m% o5 N
ADDR8002:
/ T4 O" U* s# A" Y# c) o LDA $4016,X
* u0 C* H7 S2 x  r LSR8 A! a; n5 v. ?6 ?  u9 R! d; A( i
ROL $00218 E) M. O8 B+ y4 M
LSR
2 o6 a1 S: p4 ^2 r ROL $0029
2 p' C7 d# O2 T- A( L DEY
$ N- ^0 @/ Q5 L; b; c9 m( W BNE $8002
. _( x& M; _2 _ LDA $0021$ h. K0 s" K# ^. h
ORA $0029
7 w' P0 s7 D, U; m: W8 Y STA $0021
  E: ]2 B0 l4 d$ z* }& n LDA $0020( k9 ]# b& I" H( p; y
AND $0021; L2 d- m( l& |6 A; T; a. `
STA $0020
( @9 A! L1 h0 w7 t# r LDA $06,X$ r+ |1 S+ w& F5 S% y4 `, A; a$ i1 G, ?
EOR $0020
5 i3 e! r8 j% v7 E6 K+ [4 u AND $0020
9 p& G- m' ~  ~2 u STA $04,X
% I5 l8 I* c0 v/ m7 E2 }, h LDA $0020
. v, D8 ]  x8 y7 S  F, c STA $06,X
0 i2 Y6 l( G6 e5 y+ j* ^ JSR KEY_OPERATE, z  U8 g5 u) o: J
JSR Function    ;功能调用- Q; S$ T9 c4 Y2 t
JSR Weapon    ;武器切换调用
" B/ g! \/ V! B1 |% u( u$ J JSR Power    ;威力调用  b  C' F: i) K) h/ d' x
JSR BULLET_NUM    ;子弹数目& ]/ [* _% y$ S$ T3 o% y; s
JSR BULLET    ;副武器类型
' J- K# d+ [& E RTS! P, `% Y& W( Z& h9 d; `" o

/ _# y" {  t, A2 s, P( \
9 u( p3 }2 X8 Q7 c; V6 c5 n. H& d* |! L  s, l$ B2 L
.ORG $8050
$ V3 \& r" v; b1 ]Function:    ;功能
. y, t' Z9 Q! ]  ?( s$ l+ F. MWUDI:    ;无敌
# E# E0 P& {  S  d6 g+ c3 G LDA $6000,X2 O& L9 H% B6 C1 Y$ G
AND #$08    ;开关判断
! c" y7 O$ V8 T5 ^" n, J BEQ LIFE/ [* K, ^& d. V- A
LDA #$05" ]9 d- y( k; l' A! H8 a
STA $05DC,X    ;无敌锁定$ }' l# H; ?4 |4 P5 u
LIFE:    ;生命
; f! `" Q# }. i. E: T LDA $6000,X
0 t: D9 W# y2 d; C8 O AND #$04    ;开关判断9 T( X+ f/ J0 s0 Y% T$ a& b
BEQ FUNRTS& R) q9 q. l& y# `9 O
LDA #$05
4 c7 K5 t# A( H7 R6 h  A STA $1C,X    ;生命赋值, J$ J8 C, G; O* @6 H
FUNRTS:4 u7 B0 E" `5 O
RTS0 v1 O: @1 ?+ S/ e$ E$ _+ e8 J
9 T4 L% Z- D' u3 E" G' C
Weapon:    ;武器切换& e0 d) v. o1 a! x5 q" s' k( W
LDA pause    ;暂停状态判断
7 }# ^$ Q8 ?9 r9 f BNE WEARTS
2 S& h* d( P( J) F3 I9 Y1 I LDA $04,X
" f9 C4 K% d: f+ c3 m CMP #$20    ;选择键判断! \1 g+ c7 n3 L* ?8 X& C
BNE WEARTS
! B- `4 O6 `  a LDA $12,X
) j. d( }4 f3 {" h0 u2 E: S9 ^ CMP #$03    ;武器值判断% w8 Q# D  g, H0 t0 e
BCC WEAINC. \6 A! s  v8 H- b+ I+ T8 H
LDA #$FF
( n% r: \* ~1 T; w1 D STA $12,X    ;武器重置
$ ]& V- {7 S3 k) E: d7 LWEAINC:
5 d: S& N3 A) F+ d* o$ e; \ INC $12,X    ;武器增加5 w1 [/ a3 z/ f7 |& ?0 l  s6 z

4 D7 ]/ q2 j0 x( i  K7 IWEARTS:$ h; k$ E7 P, n4 U
RTS
3 G& s) S3 c% U% B- ?. T
$ U( t$ J* u9 L3 N0 bPower:    ;威力" f! o' I( S8 S; F
LDA pause    ;暂停状态判断
1 `: h+ F8 x5 c! d4 O% A BEQ SPERTS0 ^; {3 ?/ R, S# w3 }/ A4 T& m0 q
BUT_LEFT:' K  n& X# Q. m
LDA $04,X. [$ ~% |( I! O% o! K+ q/ r
CMP #$02    ;左按键判断
- E4 ?0 V6 S1 W4 `- S& ? BNE BUT_RIGHT
6 P8 W. O0 E* `9 X1 N3 m, c2 Z LDA $88,X
: I! ?7 z  X" [! L7 ~: P! T CMP #$00    ;威力判断) w5 K5 c6 B/ z4 g8 ^
BEQ SPERTS7 `; V7 S, @* r& W  x$ o
SPEDEC
, l. K5 V* d; {/ N LDA $88,X    ;读取武器值4 V# G% p. F9 Q' z; ]
SEC2 e- F# O# }& v2 E' j" N
SBC #$08
+ {  x! J$ d  t$ n STA $88,X    ;威力减小: T$ T/ `# ?+ p
BUT_RIGHT:5 u1 i6 Z( b' F6 Y. G3 w* N
LDA $04,X
" [, J4 W; f4 k1 S9 ?' w CMP #$01    ;右按键判断) [5 r$ F3 r$ G. w7 s3 p4 i8 h
BNE SPERTS
; x' O! q  X- t% a( ]1 v5 ? LDA $88,X- E( H7 {$ o' o( y* t
CMP #$10    ;威力判断! F3 ]" h+ u' C5 L0 c  j
BEQ SPERTS- n: {: s" }& H+ f
SPEINC:
0 `1 }/ P& S6 b% R3 f+ G LDA $88,X    ;读取武器值
4 ?0 s5 Y) |- A$ K CLC
) i" z; P* y( T5 \6 l6 r ADC #$08
4 S+ G- F' b- a STA $88,X    ;威力增大  d" J  C& ~. b6 I% ?
& J* m( ?; J' H/ G# ~; F7 d
SPERTS:
. h# W8 ]0 e* T; x RTS
0 D- r/ D) R: g& k% G, x2 A, n# Z( N! i
BULLET_NUM:    ;子弹数目
% H6 ^, G9 p6 M: z LDA pause    ;暂停状态判断5 g" M9 g$ @& L& B" G9 t- {7 |
BEQ BULRTS
7 w6 M4 b0 Y1 W0 @6 n4 Q CPX #$00    ;主机玩家判断! n( x( q- ?6 N6 S& X# W
BNE BULRTS
8 e( @( M; r; |3 I( G3 X5 }' f LDA $04,X    ;主机玩家判断
8 H6 J/ [  q- `6 \' n% d$ e AND #$80    ;按键A比较6 Q5 F* J" p9 h
BEQ BULRTS
8 Z9 [/ i5 X# x LDA $87    ;状态判断
1 Q1 a6 B1 R# k) R6 i BEQ BUL_2( E- _: G' s6 P0 p) m
BUL_1:
5 |* s& ?# Z! [, i! z LDA #$00) r1 s* L8 t# d- _
STA $87    ;1发子弹$ K3 B+ F$ m8 y5 h9 j6 {/ \7 _
BEQ BULRTS
" k' l" g2 Z4 l$ e/ eBUL_2:9 \* y4 d9 X$ Q6 j) v
LDA #$01
  u! a4 _& r- d6 E STA $87    ;2发子弹
& U+ P6 ?* S4 @6 f& `- Y! Z! A 9 {2 T; l& x1 Y  {
BULRTS:, ?3 z) M, H1 V+ t! V& b1 g) o
RTS
& a) q* W5 }* [# }
3 L- Q2 v6 D, |, z/ W8 I6 Y6 ^  \8 ]
BULLET:+ c  ^. R! H* h/ B$ @9 Z& G
LDA pause    ;判断暂停状态+ ?' Y# E) c8 o6 U* o
BEQ BULLETRTS! q( }& L; W$ _" h/ T
LDA $04,X
7 ^$ F, }4 g# U( G( |9 a  N/ v CMP #$40    ;按键B比较; ?! F4 g- s6 J  r
BNE BULLETRTS
) s3 }$ V- ?) N) u9 \$ f LDA $6002,X    ;读取副武器
3 x6 ]: G+ v. u: _# l CMP #$03; }1 t, z7 A: t8 f/ a9 P6 V
BCC BULLETADD) p" L) i+ k3 J/ ?$ ~, a! ~8 g' G$ y
LDA #$FF
8 q5 T$ d( @1 l# Y STA $6002,X
0 `) t7 c$ ^1 W9 p2 R$ @0 G# \BULLETADD:
2 ~- P. M0 h; X" |$ O4 a INC $6002,X
$ n1 E. A6 y* [* J% ~0 I" w
* S& h+ C3 ?) s$ y* a. ~BULLETRTS:
$ b* s# _; q! R$ V LDA $6002,X
& g: k/ V- F& r TAY
$ o$ D; z. g2 v LDA BULLET_DATA,Y" ]% Y6 s  H" b8 h4 a) I5 K
STA $6004,X    ;写入副武器数据
) B# \0 q4 t1 U/ L# `' n RTS! G; x- |2 {- n
# c* K9 V" [) C) n9 K
- v% `* H% _* y1 `6 v7 m
BULLET_DATA:
' T% e/ H9 U' ^5 q .BYTE $06,$02,$03,$04' w3 L7 F: ?. J# `1 N1 ?

  L+ `/ L6 u* r8 k" |/ O, h * p2 p  t' s3 C, a( B! n7 W( F3 ~! p
- F* |4 r, `/ w, g; d9 p5 g
KEY_OPERATE:    ;按键开关操作2 k% h5 r- ?+ `( O! b! {
data_protect:    ;数据保护
7 c5 G  R) X9 L. q PHA, U! _! H! q, {- f* K
TXA  a1 E8 W& }1 j% A& M- F5 l1 h
PHA) s) T, A1 U* K2 m
TYA% _' Z( d0 h7 A
PHA: U6 `* }4 B  m- d: X9 Q3 l* z

; a" p8 [# R9 w" i; K/ G# l7 ^FLAG_INI:    ;开关标志初始化+ L; j$ e& ?) g+ F0 T+ f
0 J( n3 o, }7 g) h
LDA $600F# {6 x! x: S) Z5 b6 f) y3 L- U
CMP #$01) r; S: n- z4 {+ ]9 `
BEQ pause_cmp( m- i7 G4 X% |, k
LDA #$00
0 X+ h0 ?# [  n6 C STA $6000- m3 x7 [/ y" h& w* D" l3 v
STA $6001" |! _$ c0 F4 T: C* b5 a
STA $6002
7 V+ v& r* f8 J STA $6003# N7 @) f) T% V' I, S" r
STA $60045 p$ t0 h% u7 M5 k
STA $6005
, F; D+ P3 c4 G( ~) V! f' z5 V; u/ b LDA #$01: b; |7 O& L4 S. q' M7 T
STA $600F1 \* i- }$ u) a3 j! t! |: c
% j, R8 r4 ^% {* q3 S. l# I
pause_cmp:    ;判断暂停状态
9 L6 l# N. E& c2 O3 Y0 J0 a; l LDA pause
# e% u: n% b& K' u CMP #$01    ;判断暂停状态8 c  B. H/ d3 S* E. S" U
BEQ button_press! q" w1 H& M! [* i) w# |5 t
PLA) w3 J- L  h# B8 _  ~
TAY
1 l& U/ |6 w* j- L0 G  b* O PLA$ a# f1 n8 I4 n+ H
TAX
5 S2 x# K8 ^/ t0 v0 w PLA+ N# h( G# a: B' _* }
RTS1 S5 }" n& ]3 u& V

- h. _% i8 Y3 z. o- ~button_press:    ;按压操作
7 [6 p2 E& p( F+ T1 Y5 L2 B7 lini_Y:$ w& D( a9 k) W  i& f
LDY #$00+ T0 `( M* O; B' W5 ~6 H! A" M& U3 l
button_cmp:2 p+ \- @. b- z
LDA button,X9 |7 T& Q, S7 g. j1 R/ x  j
CMP ora_data,Y
( O/ T/ e! Z# P, b: M% W0 n/ B! @ BNE count_Y_cmp
' T: S6 v( V  o9 e% L5 m6 nflag_cmp:% ~) B1 f* {/ M
LDA flag,X
4 m: o/ Y5 {1 R, h AND ora_data,Y
4 }, B( c7 b. S) |6 Z5 X BNE flag_and
+ Y. w- G0 E8 }0 s  Z0 r% n2 mflag_ora:
* S6 J. ?2 G2 }- x LDA flag,X
0 |! V9 o, g" ? ORA ora_data,Y
( q2 D1 [5 V, p0 n STA flag,X) ?9 @, n; p) Z2 |) m
BNE count_Y_cmp8 X7 M" `3 g3 e  C- s# ^& o
flag_and:1 S; B1 ~; x3 V( I
LDA flag,X
) D0 o7 e* O9 l AND and_data,Y$ d* W% n  t" n. z4 }
STA flag,X$ t" Z/ l! y' m0 h
count_Y_cmp:
, I9 ?  E+ P- q" U) B5 B& Y INY
5 V9 R' j: j0 z9 I5 `+ l CPY #$08$ y- O9 M+ K: U5 P0 A, S
BCC button_cmp# @% ]  {, @+ K$ p! g8 w
) k2 H, N+ u$ Z& n4 A4 Y# F2 |
data_extract:    ;数据恢复' }& l  U& n& }) L
PLA
- a( f2 q1 f9 q. f! a0 H& b2 ^* f, G TAY
! B) L; U* X/ f3 H5 U& t PLA$ N/ L7 l7 {1 `5 k* e' t
TAX6 ~+ o. ^* J+ X) o2 e8 j2 Z- v
PLA- @" ~3 v( s3 r/ B4 i5 {2 v# G

3 U3 T2 I. E$ oreturn:
" F; m4 J; l' ?( X RTS
$ f0 g) V/ o% `3 ?
" j7 U/ T. g) T4 uora_data:   ;按键相或数据
/ S7 p$ z/ V  d8 _ .BYTE $08,$04,$02,$01,$80,$40,$20,$10+ D- Y' H4 l( ]- y" H& B- V
and_data:   ;按键相与数据& P% v, S; W. x0 [; _) d( v
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
# g# e0 L* `& D- F$ b! O( d
% Q, _( g2 W: N# y3 o 4 D" m, w. i* [1 }7 y" T" U; u

% |$ H+ k' e$ u ;FC数据搬移程序 BY FlameCyclone
3 J$ v7 A5 K, g; ~$ S8 f .ORG $82004 ~: }7 F( q# y0 b3 g% c7 q; a0 i
JMP DATA_COPY_PROTECT
  V- v! @* x' }3 w3 b2 D
# c: X2 h9 r& S3 F; yADDR_DATA_TO = $40    ;目的地址
. Y9 r% I2 r2 D$ bADDR_FROM_START = $42    ;源开始地址8 Q  ~! u; n5 h  e
ADDR_FROM_END = $44    ;源结束地址
1 k% O+ R8 X' i0 L
/ Y1 d2 j' E5 s* i  EADDR_TO:    ;目的地址( h7 D% g+ a; x; V( l7 _! Y2 w. E0 b4 L9 r
.BYTE $00,$70
/ R( h) S6 S* Q' g" RADDR_BEGIN:    ;源开始地址) O# T# V/ j4 H! g
.BYTE $00,$83
3 @# i5 e+ m1 r  v' o$ s. jADDR_END:    ;源结束地址
) ~4 ~3 z' M* h% k6 G .BYTE $FE,$84; W' U2 o4 j0 K. Y5 |% o
& b$ O8 g; X6 ]- @8 s$ S0 |$ M
INT_ADDR = $08    ;中断地址
  Y% a! n4 k! z3 Q7 j- A1 h# L6 g( TFLAG_OVER = $71FF    ;完成标志
7 o3 V" a" j* g$ s  P4 q
+ y) W  _3 k6 b. P# L( e; ^6 D' b. q4 h  {$ b9 `
DATA_COPY_PROTECT:    ;保护数据
4 H# n. H1 _$ p0 P8 O" d. _ PHP& J2 v2 p. n4 m( d! J) R
PHA
: w% @6 l9 I+ D; l4 X3 I( Q; P8 L TXA1 _6 H& u! w5 v. W
PHA( y6 V+ d- L3 C6 C8 V; Q! S
TYA. ~! P5 v$ D. @. ^. t# e& g
PHA# L; P* I+ U3 c4 S
LDA ADDR_DATA_TO# ?! S2 \& ]( I2 N8 u: R
PHA
* v( c& h! K3 M! h LDA ADDR_DATA_TO+1* C7 q: J, `# c7 i" [4 ~
PHA; @2 Y& A- F1 _# E
LDA ADDR_FROM_START  b: r# Y1 Y- B" s9 ]
PHA
6 @! s" Y' {+ X/ x  U( n7 k7 g7 Y# J LDA ADDR_FROM_START+1
" ?' J* H: g3 v7 g( \2 W! N& I" V PHA( r  ~5 r" h. q( s; y
LDA ADDR_FROM_END/ \  ]5 i6 l9 l$ C; @  P
PHA
9 ^: t8 f2 ^  f# n LDA ADDR_FROM_END+1
' f% e7 Q$ E9 P PHA
8 |' o! _8 t( C) g9 s
8 u( H: D1 d/ \) k. YOFF_INT:   ;屏蔽中断: x6 j* @& y' @
LDA INT_ADDR5 T) J% f: _* m7 @& o
AND #$7F4 U$ N& h' s; S$ I/ ~
STA $2000    ;屏蔽中断
, E& y6 Q: N9 ?! S$ g3 i. ~7 ]4 e4 z% w1 p
0 _4 t& c4 \7 j. D3 \
SET_DATA_ADDR_START:    ;设置复制起始地址
. n1 y* Q2 t, [  |0 ]5 H LDA ADDR_BEGIN6 F$ k" {/ c' ]# t
STA ADDR_FROM_START    ;设置复制起始地址低位$ q6 I2 c: B! \9 G9 Q& h
LDA ADDR_BEGIN+1
( i. n* g; B) d1 S( M( B* h9 \( o STA ADDR_FROM_START+1    ;设置复制起始地址高位
1 Y9 H- Y4 D* q$ a , A& b( v9 m9 T) T7 [( X4 L! s3 b% p
SET_DATA_ADDR_END:    ;设置复制结束地址
0 X4 f# k2 a/ d  J0 S% p/ N LDA ADDR_END8 o9 P! f$ J& p. G% J4 }
STA ADDR_FROM_END    ;设置复制结束地址低位
* `) s- X/ {4 @& m LDA ADDR_END+1# R+ A- X# g' o% A/ K
STA ADDR_FROM_END+1    ;设置复制结束地址高位
2 F8 S9 i7 v8 m7 p+ F
# C; _: p' O( O$ o6 X5 fSET_DATA_COPY_START:   ;设置目的起始地址" @$ m7 X1 E- F7 ]3 R/ K  H
LDA ADDR_TO
2 G" A6 R  ?  D5 k5 V STA ADDR_DATA_TO   ;设置目的起始地址低位3 ?4 N  l0 K* [- f
LDA ADDR_TO+17 c* x0 i2 B1 x6 t
STA ADDR_DATA_TO+1   ;设置目的起始地址高位
* b$ [* U+ S) R
7 @9 F! s8 o3 J6 m/ SOVER_COPY_CMP:    ;复制完成比较1 e! [+ z4 I1 [& M* x+ d
LDA FLAG_OVER
- p- |- p7 e: Z+ L# P8 \* p CMP #$FE    ;复制完成标志比较
. \1 S9 ~6 N, p% Z BEQ DATA_COPY_EXACT
: y8 M: q6 Q! s" m3 G, F6 W& a! u3 C. a3 |" U3 ~
INI_XY_COUNT:   ;计数器初始化; b, N! n& @, t; ^) a. I/ m) E
LDX #$002 f0 [# E$ b# h6 }+ A
LDY #$00
5 p. q* G' C; ?/ c
- e0 Q; |7 {; Q* J. dCOPY_OVER_CMP:    ;地址比较. W# r' p$ c0 V0 n; X0 t* z6 ]  V4 J
LDA ADDR_FROM_START# h0 h' X" p& Q
CMP ADDR_FROM_END
: h. b  T/ S9 J3 H7 ~6 N( V8 G BNE COPY_START
" s' i9 F3 `* l9 ^1 S' `  W( Z LDA ADDR_FROM_START+1" \7 t' r( H/ |( j8 _
CMP ADDR_FROM_END+1
2 O: X! h8 K; J& H BEQ COPY_OVER
* E1 L1 W" S, ?0 f: v+ v 5 C- d4 S1 d* O3 n9 E0 B2 K) Y
COPY_START:    ;数据复制开始
, r: v# t& X) U# B4 h$ U0 b  X! \ LDA (ADDR_FROM_START),Y    ;读取源地址
8 q3 c- e- G, B% N. [ STA (ADDR_DATA_TO),Y    ;写入目的地址
, J7 f8 ?4 ~4 |# f0 h INC ADDR_FROM_START   ;源地址低位递增
1 t( z9 i4 W; m* R; E, J* N+ M/ ^ INC ADDR_DATA_TO   ;目的地址低位递增
# N! E( D6 J( G- J BNE COPY_JMP+ M3 r6 @  W( T* Z6 T
INC ADDR_FROM_START+1   ;源地址高位递增7 f  u0 T& v# k3 k) V% c) X
INC ADDR_DATA_TO+1   ;目的地址高位递增
9 [0 S, L0 c2 Z. H7 [2 x$ w/ s& P4 y + L/ M  }4 J9 _8 `
COPY_JMP:   
" q; D: u% o6 e# ` JMP COPY_OVER_CMP  [, f# P, t5 ^3 [

$ a' H8 j% c* U9 L2 qCOPY_OVER:    ;复制完成
/ N1 R! y, b* |# [; r9 v, i LDA #$FE6 N/ F" x0 M2 i5 F
STA FLAG_OVER    ;写入完成标志. f( w8 w: T/ F# ~3 k/ ^
FINAL_BYTE:! {* T/ a$ ?2 I; a
LDA (ADDR_FROM_START),Y    ;读取最后一个字节
0 p3 _& m# d; g8 m3 f9 d! d9 s8 j STA (ADDR_DATA_TO),Y    ;写入最后一个字节$ M- F7 n# F! [" C, k7 G

2 b" E! L3 q- ?5 C/ r/ |DATA_COPY_EXACT:    ;恢复数据
6 X) l1 }3 z# L" ]$ w  x LDA INT_ADDR
. S+ N4 B/ ~2 ?) U* B5 U STA $2000    ;恢复中断5 J2 a" o* q6 G
PLA3 C2 B" G2 x5 H, {
STA ADDR_FROM_END+1# f# Y. D7 T  g, \5 p$ i, H  g
PLA
$ D6 j/ s5 P8 H1 Z; @ STA ADDR_FROM_END' ~* o! L) |# L% j0 u
PLA
# ]3 R8 ^: k/ G STA ADDR_FROM_START+1+ d2 X/ p" y% u: O# w
PLA) _( p4 w8 R. d1 I
STA ADDR_FROM_START2 d( g. i" e; d% O6 s
PLA; C# D4 {( q7 Y1 `+ |
STA ADDR_DATA_TO+1
( x& ?8 P8 U. |: }$ ?$ n* \ PLA3 Z) S1 ]; a+ e# d
STA ADDR_DATA_TO
  @* U6 S- ]: r& R5 `% s PLA  N9 I  L! ]7 [5 w* `
TAY
0 t: {8 |) m- g1 y! b0 u& ] PLA, \( a9 q$ W% P$ m" @" n7 H
TAX
% J6 W5 F4 h  m) o PLA
  r) E$ ?! v6 o, q$ g% M PLP
3 w: P+ D5 c+ D
4 b) _2 U* Z/ B# U 3 k7 K9 h' X! I
# B* k% y& `6 D: x& k5 }6 |- U
DATA_COPY_RETURN:! c/ V- p5 |0 Z/ @" b# P' ?6 j  z
RTS
1 H! v% K! ~  X9 J4 a' T& V& c, W
' p/ ~% Q5 O/ o0 I4 [! e1 O5 w* u .ORG $C056    ;精灵指令覆盖
8 R) V! y, W) |, r  W JSR $FFB5, Q( ?8 j$ l  ]" t
/ L: v/ O) }" P
.ORG $FFB5    ;/ c- k% t5 p( t' R
PHA8 O* P+ P" [$ f2 B
  TXA
3 X4 Y+ k& c0 y PHA
1 ?* T$ Z" w9 S* _: Z TYA+ }8 J5 T, F4 u
PHA/ Z; @9 W' E1 d4 x6 |
LDA $71FF    ;比较7000-71FE数据是否完成复制; g5 ]% V; U! K6 }  n3 l0 H
CMP #$FE/ Q% o" N3 z; D  n
BNE ADDR_FFCA
' g2 L5 z0 e: r* q PLA( Q* N( o0 e, _) @- L
TAY
5 D1 ]; u, x/ F2 E. `' i PLA# k5 f% D' }: r( ]
TAX8 y1 K; R; x+ ]0 W0 w7 ]1 U
PLA( A. |1 o. k! Q9 y) |
JSR $7000   ;跳转到自写程序" U1 O# T% v: A0 z
RTS
# w$ N8 M. o$ ]. zADDR_FFCA:! H$ A( L+ g5 A" p* u: L5 K8 E! n
PLA% M; q- w' H6 x' Y" H
TAY. A1 W7 `  J% D& c
PLA# F3 f: y' x# e
TAX
4 Y$ b) @$ x4 j+ p& b. Z: P PLA
5 k; z( x+ P& \* K2 G! D RTS
& ~1 p6 t3 S: ]9 t
; q2 b9 }9 D+ k; {) O1 p+ w: @5 n, L% |+ r" `: L( R" a7 @
% r$ w* {7 t( Z% k) s! R2 Z
.ORG $C264    ;自定义的MAPPER2切页程序, a$ {/ t9 \0 K) C6 }9 I9 v; J4 \
PHA
& o) @8 T* B: E* r) C TXA
8 n' \5 ^/ o1 v: S" N3 p PHA1 i. X0 k" Q5 ?3 \2 ~
LDA $0066
4 z* S4 Z2 H9 p. w8 q BNE ADDRC280
/ [* Q' Q/ V" `: t LDA #$074 i% Q/ {4 N) S/ E" U
LDX #$03
* f, j/ H- J$ d7 \1 [, K8 G JSR $CD9B    ;自带的切bank方法
" b7 S+ L; F+ H, _( O9 R5 U PLA
, c8 }/ f! i/ `9 e9 X/ v TAX
6 i0 K1 }+ ?7 c PLA' e8 P) x+ V# p4 j( I( R
JSR $8000' e. g/ j& N& z; ~7 ~0 g  \6 q
LDA #$060 ]! l6 s% C0 w% P
LDX #$03
6 k0 |& s/ ~4 O5 q' i, ` JSR $CD9B    ;切回原该切得bank(可以不用), M3 `# U) W! N; ^4 G/ K
RTS2 N& ?- \3 H3 O% g* m
ADDRC280:
2 N- r3 {7 k: q) ]! `  R PLA' S) K& Z: Q, j& Q" b5 t
TAX
8 g/ ~5 s) y6 w1 K PLA
5 k9 |" Q2 Z, e1 M RTS
& ], P' }7 [3 l2 J/ [4 r; S 8 g. D8 B8 [" X' r% t) E& P
' X* b9 {& [+ w4 U; F
;[FC][最终任务PPU][END]- \5 n9 s) i4 V; f% D7 w
.ORG $C056    ;跳转到PPU重写程序; W% j+ D: r) Y1 W  p" @0 z
JSR $7000
4 R! L5 m' U" v3 l, n
9 ]- ]  q, z+ b .ORG $CEBF
: M/ h" y9 Q8 c; i' H4 s3 L JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入; I1 S+ l' W4 G
  $ E% k$ T) e/ I* s0 F/ g
  .ORG $E460
; A5 o& p8 e! ~2 @3 O  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
0 @+ I9 ^3 `) T  
, G! I9 y" F6 W! E) B; d% j .ORG $71F0
; M' y, r& V8 MSTAGE_DATA_WRITE:$ T' y  I# q/ E1 p% U! A
  LDA $6010
/ v! w% b" v% P$ k9 ^5 j6 W  STA $1E    ;关卡写入
. s/ l8 R1 L+ w  LDA #$00* E/ q5 e, B" {( D5 a* F5 ^
  RTS
- W0 W7 \. T' J, F" g .ORG $71C05 g* i9 i. i0 [, J6 ]2 G0 E
BULLET_DATA_WRITE:    ;副武器数据写入
2 X' T7 l2 u9 J+ t CPX #$0E7 B  j+ x5 H( |* D0 o9 e
BCS P2_BUL
, p! R% B: ]7 C" j/ vP1_BUL:
& O# Q  b2 q4 h- G* y LDA $6004* R2 k) N6 I1 d/ ]
JSR $D7D0    ;P1副武器数据写入/ d% X& m) O4 [8 {% m% A2 e0 [7 ^" J4 J
RTS
' W& d1 A; B; F7 X2 w1 W$ J$ mP2_BUL:9 Y/ T% Q: R: t  d- q( k* o' E
LDA $6005- n% |) |6 M& p$ z! V, y$ {
JSR $D7D0    ;P2副武器数据写入' c) i+ p4 ?$ Y: g6 b% t: E& f2 L
RTS
9 W. U9 `# `3 _% a& b0 e1 J
( g3 }* w; J7 K) C7 }
# y( W, M2 w7 z8 T .ORG $7000. q7 `5 r1 W& f/ _% j
  
# i: D# n7 Z) ~ STY $4014    ;补上覆盖的精灵写入指令
; e5 t. ~( j8 O" u  T PHA/ v2 l$ c9 L4 {4 T) z
TXA
$ J  R  n: L% P PHA4 L2 s# Y+ U% g- ]7 f
TYA
2 U, f' v7 q4 ^$ h: g$ v% v PHA
3 g  U# @0 c( t LDA $0C( V) X  g" u3 T+ D6 q( O# |! Y" y/ h
CMP #$01    ;比较是否为标题画面6 D6 u# }: J9 Y
BEQ PPU_STAGE  A) j+ q# ?0 v  a& L9 c
PLA
( c, b6 W! R1 f* L) [1 \1 Q. w4 t TAY3 N+ D, ~! q0 [
PLA
! \, R$ M; g0 K' m TAX+ w/ |4 R) s& J# b$ b
PLA8 x, @2 m: r$ a
RTS
' m7 C" v. e! X, V! N, [  ZPPU_STAGE:    ;STAGE显示程序, ^' d" o, L; N$ p. u. h0 p/ V" x
LDA PPU_ADDR_DATA. K; e$ p6 ]3 `2 l
STA $20061 D( k& g6 O# e. f3 o& C
LDA PPU_ADDR_DATA+1
" @" B4 ~( f) h! G: p0 X STA $2006    ;坐标设置. G! @/ Q7 j+ m6 @( m0 ?" t
LDX #$00
) H+ `6 O' D: {; q6 Q& ^6 G$ P& FPPU_STAGE_WROTE:    ;写入STAGE字模
7 h) L. d& n6 t" n- F1 ]& [- { LDA STAGE_DATA,X0 W- l- y1 C5 _' \" y
STA $2007' E0 A4 G3 @& W8 s# q+ z* J( \
INX
- _; Z8 S; L1 k  v CPX #$064 {! F, V+ T$ c% p; V
BCC PPU_STAGE_WROTE
# [+ V; @5 T0 K0 H4 Q& S LDA $6010! g1 u6 s1 w# ]. f9 j6 }% L1 y
CMP #$FF    ;关卡数据初始化条件判断! t1 o: u# I4 ?9 P1 t+ E
BNE KEY_B
: N5 Q6 R( L# C! d LDA #$006 L0 p* P% S( P7 x$ b0 k. _
STA $6010    ;关卡数据初始化
( O# h1 W8 Z0 ~KEY_B:    ;关卡减少
4 M+ \, q  v( }9 ` LDA $048 r" j0 c! t. y
AND #$42    ;按键B或左减关
" |: E( K+ P+ R; W) E  `# p BEQ KEY_A; j0 [  k' `* V
LDA $6010
) e$ p7 U0 ~8 Z7 A. p CMP #$00    ;关卡比较
8 n9 o, w& J' @$ ^" g4 R+ Z BEQ KEY_A
0 t, k# G! k6 t3 R2 \% c5 l DEC $6010   ;减关' Z2 l3 q# u% M1 X( B; c' @
KEY_A:    ;关卡增加1 h- L4 j9 E2 k: |0 x+ b
LDA $04
  A$ [9 z# M! u0 Y2 k. U7 k% M/ k AND #$81    ;按键A或右加关
6 f2 ]. p" e. U) B BEQ PPU_NUM_WRITE/ c9 V4 S/ B( S9 t
LDA $6010
5 }8 O* o* T# M, z. U) T2 m. X CMP #$04    ;关卡比较
1 U( e8 J4 v7 o8 Y9 v( d' \" ? BEQ PPU_NUM_WRITE
3 }) f3 D$ y0 M7 a. f! e6 V. H INC $6010    ;加关! m1 m7 y# S; r
PPU_NUM_WRITE:
) U! d8 L% `0 C. e LDA $60104 W/ |6 a% ^1 c( U8 Q2 g7 N
TAX( {9 G9 q+ Z& w' E. r0 b
LDA STAGE_NUM,X    ;写入数字
3 \4 U9 c' |% Y4 s3 \& q! Y4 S% V# L5 _ STA $2007
* t( l: Q- G' v" o1 L, X! F6 w2 i5 dPPU_RTS:9 K) ^# z3 @% E4 M: P" `: A
PLA
9 u% s& K8 x! J9 ^ TAY
; }3 {7 G9 {* a% L# ?. P PLA# c. p+ C/ r3 N' p+ y. `
TAX4 ^: o  M: T1 p1 T5 N# a$ G0 V
PLA* b) W9 k+ `) f7 e. O: X: S: `1 v
RTS
- z/ Q5 [( o. M9 x6 o
( u2 c3 P6 }9 v  }, J% b$ h8 m
3 Q5 l, y4 C  I' S8 `+ dSTAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据$ V9 ^; x0 \. Q! y$ N# E% s
.BYTE $EC,$ED,$DA,$E0,$DE,00
9 \! b4 ^* s# L% xSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据) j8 g# f  d, k. `
.BYTE $D1,$D2,$D3,$D4,$D5
8 P! G' U+ d( ^3 W5 |* ?% R9 |
( N2 U- X  k: p8 P: K6 J: _PPU_ADDR_DATA:, m9 v% [& D( q
.BYTE $23,$0C2 u) ~& {- s. F( A# U7 Z4 T

3 I# E' Z4 N) k  [

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2024-11-19 09:37 , Processed in 1.085938 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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