EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
  k9 D/ y" U1 j# V. ?" p# J+ |
3 O. I: L: J* E" H4 f" p得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
; h/ A4 B- j; h' V% R7 B6 r, g5 I然而,今天想到一个思路.% Z# }' M8 ^  j2 n9 r( J' A. g0 ?
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.& r; O9 e; Y1 U1 O
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE" {& @* s1 K0 [. w# S
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).  s$ T6 E$ ^' u! q& |0 F+ s3 H

- F0 m! T4 I" \$ z: b+ h8 [9 C$ j. Q9 \+ ^
;[FC][最终任务KEY][END]
: L2 t( y( ?6 Q) G* @button = $04    ;单次按键* K3 E, u# ?$ l( ]
flag = $6000    ;功能开关标志
* G8 g2 V  a8 g4 k( Q& Gpause = $000E   ;暂停地址
3 a) F; Z3 N# h3 z3 g+ p/ W& F0 W. V. f* b; D
.ORG $8000# d& ~' J" ]/ O. b
LDY #$08    ;自带的按键程序1 N$ i# s" I& v% o( L7 ^
ADDR8002:
+ J3 P, V6 `' T7 y1 N/ O2 d LDA $4016,X' w0 Y0 ~1 f+ w: l
LSR" D5 h( F. A$ C. m, P  S* I3 P- _
ROL $0021
' P' k) C6 ~6 R$ E$ ^$ [ LSR
; P; m" c& X: X& m8 ]$ k1 J# N! m ROL $0029! m- d6 s' W* G, L1 {
DEY+ ~# I7 I+ _* Y5 d) S
BNE $8002, F" D9 H- g# I$ p4 ?
LDA $0021! J: Z4 _0 ~  f$ |7 ]3 f! l
ORA $00296 H+ p$ u% c" ~7 v
STA $0021
6 m: n: L" C7 ]. v9 x LDA $0020  N- T6 l. s( j4 a; n
AND $0021' E  ?+ X) f  b6 S, N# P5 u
STA $0020; c2 Q3 c  \1 ~" {" ]
LDA $06,X
6 A. w* g1 O  L  C6 p3 l/ h, N EOR $00202 J( L! k# g6 e4 M1 ]7 B( \
AND $0020- ^0 h% Q$ o( U( E
STA $04,X
; |, h, i9 S% c LDA $0020
& Q+ L- b0 v! W( M7 q2 e- k STA $06,X
! F4 t: @' b) H+ o# Q) C JSR KEY_OPERATE
  q( ^$ J# U  `: I6 h5 M JSR Function    ;功能调用
/ r9 |# U4 ]0 C2 H5 F$ n JSR Weapon    ;武器切换调用
8 f+ N4 d2 R& f7 D+ C4 x! | JSR Power    ;威力调用
' R4 i3 S* L! R8 C5 n1 k5 g: m JSR BULLET_NUM    ;子弹数目$ c" Q3 J+ J3 B- R0 L
JSR BULLET    ;副武器类型* y* N. `: e  v; V8 [" q' q
RTS9 d( h# S- u9 ?

- Z5 Z. \- R8 v - S9 N; v3 ?, k

) ]' S' b& v( d: {3 q .ORG $8050
5 \7 @8 U" f$ H9 Z/ \4 SFunction:    ;功能
" V3 I; H3 b: h& F3 V. H: N& R, JWUDI:    ;无敌+ |3 r' r+ m: x$ k
LDA $6000,X6 b7 v- V! K4 G, m8 R5 A0 Z: {
AND #$08    ;开关判断
- T: {6 m  j& Y% B. H' V5 @$ P1 ` BEQ LIFE+ w, m( T4 v8 s" s; ^% K5 t
LDA #$05
  K8 K# c4 J! O$ W4 ]* j! L) C STA $05DC,X    ;无敌锁定5 ]5 I3 [: |* V. C5 w: p5 ?3 c
LIFE:    ;生命6 O2 g& X, c& P: h5 P  B
LDA $6000,X; P) Y0 w4 g5 _' X6 ~$ S! o
AND #$04    ;开关判断  Y+ @8 ]- E' {) E
BEQ FUNRTS
4 }5 C7 M' N2 f4 m! O) Q' Z  ~* v LDA #$057 @- `, d: U+ p# R* j& e
STA $1C,X    ;生命赋值+ F' e7 a6 l1 G& q
FUNRTS:
; ^( S  d# i/ H% U4 [ RTS& \9 o) G2 Q) p5 d
) o) J8 P) f5 Z6 d& X- J
Weapon:    ;武器切换* x  x7 e3 j+ A9 ?+ {
LDA pause    ;暂停状态判断
4 s0 v6 \- u& E2 m# { BNE WEARTS
- t; V$ H( N! j/ v LDA $04,X' o& c  u+ B0 Y, Z* L
CMP #$20    ;选择键判断
# B1 ?! l) I1 B- f8 p5 m BNE WEARTS$ f2 p; E+ |' {4 A% O2 `, {
LDA $12,X
  n& I; n% [& z8 m1 r, P# y CMP #$03    ;武器值判断6 ?) i; i& `9 I4 x4 S9 @% D# O
BCC WEAINC
5 U! f8 O" L) j5 ^; H2 Q/ Y LDA #$FF0 B* D6 v0 z2 P' ^7 s+ }
STA $12,X    ;武器重置
4 m. v7 B' i- s7 Q. M* m5 ?WEAINC:
  R& k! @' a* L. j$ u+ F INC $12,X    ;武器增加
  A; H" K3 g  Y" @ 1 B9 y: A. }1 L+ f( ]$ e; r2 @/ N
WEARTS:
7 p% W, R% o4 D RTS
7 O$ j' [. f: F7 |/ _- q4 Z
  w% D8 r5 y, ]! I+ z! J0 uPower:    ;威力
: n5 |$ \+ j8 e. P& D( ^6 G' y LDA pause    ;暂停状态判断
# Z+ s! [7 J# O) P# ?) q BEQ SPERTS
# h5 A+ H# {% t% J- J, KBUT_LEFT:+ f9 y$ {, r, i- Q
LDA $04,X
' l8 v' s" l, B" U% f/ t! ? CMP #$02    ;左按键判断
' {+ t+ ]$ \2 h6 R6 C BNE BUT_RIGHT. I( q- u, q* p2 ?
LDA $88,X
4 j4 O* X! _' U" O' P5 o CMP #$00    ;威力判断& ~& J7 V& j0 o. U& x2 f2 v
BEQ SPERTS# ?7 r' d. s1 w
SPEDEC6 M4 |# [; ], [8 h8 B
LDA $88,X    ;读取武器值
% H8 j& \2 n+ e- ~' w4 o SEC
+ R) {& k9 N) Y( K% ~ SBC #$08) @5 Y& Y9 z( v; B, X' e, L
STA $88,X    ;威力减小
/ }. A6 F  c5 J9 pBUT_RIGHT:
) `' X. N$ `5 {5 ?% h( H# u8 w9 K6 n LDA $04,X: O0 ]& I2 \( l( r: K) `  N
CMP #$01    ;右按键判断
7 g" h  e: [# x+ k BNE SPERTS
( Y! `7 d( H3 E: Y; ~* ] LDA $88,X0 ~# R% ?, _0 A5 C* O" \. |
CMP #$10    ;威力判断
2 P( O2 |3 W0 }) d BEQ SPERTS
( T  m1 l, \6 r8 k( O9 O  F8 gSPEINC:( f. W( @6 k+ B
LDA $88,X    ;读取武器值5 @0 ^& B% n: O. a1 T, \
CLC- y: R9 x' l) x. }
ADC #$08; J6 K. l& D6 ?3 x; Y' i% t" l
STA $88,X    ;威力增大' j' [8 Y' E1 j2 ]- U

* ]0 b. u& D" lSPERTS:9 X; z8 v. K& P7 X9 V6 E
RTS: s9 [9 L( w5 Q0 H9 k: ^
! c$ O8 x% E# f) z
BULLET_NUM:    ;子弹数目
! T' F% \$ j: F7 | LDA pause    ;暂停状态判断
/ S0 {' s1 y0 C+ t$ k BEQ BULRTS7 R; t* t# m/ P- x% \
CPX #$00    ;主机玩家判断
+ [4 J* j0 v; _- s* p BNE BULRTS
5 N5 i1 k; E$ |5 v5 ~/ d LDA $04,X    ;主机玩家判断
) @7 @4 J; [; I2 R% i* U; W9 [ AND #$80    ;按键A比较
- B3 d3 }/ s" Y: w$ l BEQ BULRTS. d. W- v4 f. s' }) A7 B1 K
LDA $87    ;状态判断
+ E5 E: r; P$ a% r BEQ BUL_2& U8 D9 S9 a) y1 B# i
BUL_1:
* m% _- z: J0 N$ {6 @. {! g9 H. d LDA #$00
8 ?( f, m  x1 H7 { STA $87    ;1发子弹
% h2 P( I8 D+ u. F' L BEQ BULRTS- P! m# q+ K/ |/ c$ E, d$ L
BUL_2:+ U; R9 Z: M. Z
LDA #$015 ~4 {( N( g% j6 O+ \5 F
STA $87    ;2发子弹
0 q: e$ Q+ o/ s0 K 5 f9 q0 `% I/ B
BULRTS:
4 k' r5 Z9 ~+ N- s! d. s& F RTS
& ?0 n  n' F$ s" ~
9 U. l$ e- {# Q, d9 O& f8 j
. h6 b# Y/ u: K3 x  ?" zBULLET:
: @/ j6 r# S+ B LDA pause    ;判断暂停状态! |  w# F. C" I) P% e, A9 ~4 m
BEQ BULLETRTS" n5 G% w5 O! P' q. p
LDA $04,X7 o# W' R: d7 V5 ~4 e
CMP #$40    ;按键B比较6 p8 J' f$ u. m, P8 `
BNE BULLETRTS
  d! E8 F+ X/ q. ^2 | LDA $6002,X    ;读取副武器
% k/ ?1 ?5 D+ w% f$ y) A2 J; V: Y CMP #$03: c+ B+ s/ V7 h3 S
BCC BULLETADD
9 X$ K' S) x* ^! b% ^ LDA #$FF6 A* S0 U* v! t
STA $6002,X
( |" [0 o. y0 c6 S% F. _BULLETADD:6 w; s, h" A( D8 O; v; [: i; D
INC $6002,X; l: }! w! I0 ~% {$ h# c" Q) m7 i
3 e2 J% X, N# J7 y, ~2 ^
BULLETRTS:
6 w4 V$ ~) y  y2 | LDA $6002,X* Y$ _/ o/ q& \2 G1 u1 L4 |
TAY9 Y5 a7 F+ v1 X/ L$ C8 _
LDA BULLET_DATA,Y
% g6 w! S' v( G1 O3 X# P% [1 \ STA $6004,X    ;写入副武器数据$ H6 V1 \# R3 V# t
RTS
9 X& o6 o) A& H
0 l$ p& }! Q3 Z; w1 _# Z0 O5 M' a7 {
+ H; w# Y! ~$ p/ ?. @BULLET_DATA:1 M$ o! D/ Z' W- M0 R& f
.BYTE $06,$02,$03,$04
! t( Q' U" G- \2 d
6 u# }: Y4 m( I4 F; y; C4 d' N
) d- I: V* a, v- S4 j   i2 d- u' ^$ N
KEY_OPERATE:    ;按键开关操作
2 v$ R' o& Q3 {7 m! O3 Y" Bdata_protect:    ;数据保护
* J  Q+ R' O/ ?3 }* d PHA& [5 D5 [% f0 D; N: v
TXA
7 U4 R3 R' D' ?6 h8 \: ~ PHA; O$ J% x' n% t# t$ [& p# D
TYA
0 a  N: w; ^" p4 r) Q) e PHA
5 j1 K: P& i) ^8 n6 p2 U8 F9 ?6 F# F- k
FLAG_INI:    ;开关标志初始化
6 z" i$ @( \7 r
& m9 @( V, P" K- Z7 B LDA $600F9 B0 t6 h, [! p2 }9 o8 d/ w
CMP #$01
5 p0 x# E# s6 h1 n# G BEQ pause_cmp
1 w  g1 p8 O% y% l$ i( [) W LDA #$00' d% b+ Q6 T5 l+ Q7 B
STA $6000
; G3 h5 o, h' w STA $6001
: X2 h2 [2 ], i; V7 }( Y STA $6002" _2 I* ?$ |+ n- y
STA $6003
5 N& ?$ ^) }! S" S3 c STA $6004- {2 z5 R0 y3 N; ^, c/ I3 i
STA $6005+ n6 n0 E* m! p. @# w* y
LDA #$01/ {  ]% n) n8 X
STA $600F
# J% D- ?% M; A  V3 d9 v5 o) M   m& Y! P0 r1 j, H  e6 q
pause_cmp:    ;判断暂停状态5 o& c0 X7 [& u
LDA pause
4 w$ S( a" b! m+ ]. j$ k' m' d! O  f; k CMP #$01    ;判断暂停状态
8 B8 ^3 \$ A2 O  g BEQ button_press
9 G5 w% p4 Z/ q4 [; L( E PLA
6 ]0 P$ w: S1 B TAY
9 Q, H+ f9 M+ Z& e  T1 r) w. Z PLA
2 S: o( n  Y' T  z; K% ^ TAX
2 h; q- M2 B6 J8 U% I PLA3 k( n" G. l% D. I+ M6 c; ?
RTS
7 p( r. \" y) C+ q6 C0 ~
! r. ?8 v8 p2 q/ [# Nbutton_press:    ;按压操作
. O$ f. S2 L, f- iini_Y:- Y+ p- I0 k9 u
LDY #$005 A2 ~* ~8 c7 @
button_cmp:7 Z5 R: D8 R3 m. e7 A5 ^
LDA button,X4 ]# [3 E9 Y1 r" r
CMP ora_data,Y
  p, Q4 x- ?5 V& L' v# Z$ z BNE count_Y_cmp- B; D  r9 v' o/ L" ^/ `
flag_cmp:$ U0 }/ R' ~! b9 D
LDA flag,X" e: I2 ]4 t) `# I; [. O0 t  Y
AND ora_data,Y& s; d  v5 r+ {5 A
BNE flag_and4 [. D6 g- G: f3 G' q  c% j& I( }
flag_ora:8 j/ X$ V7 H/ p1 l/ D
LDA flag,X0 J8 Y5 k. v2 t- [* P
ORA ora_data,Y
( q. u% f' A  Y: S, G STA flag,X
5 k0 m& s6 Y2 Q! u4 b4 H BNE count_Y_cmp
) B1 \" `4 ]$ m$ n+ vflag_and:
" N2 Y+ U2 g* N0 q LDA flag,X5 h+ T- S6 M" I6 s& U/ N
AND and_data,Y
: o# A* X8 R; h$ f% d& A" \1 j/ w STA flag,X% \9 d7 Q7 s. l% H! h. g
count_Y_cmp:& f- V* C: [8 z2 Y
INY
! v+ l% l% }' f  L4 D& L CPY #$08
8 p3 z. L  m4 m3 H BCC button_cmp
9 u/ J) x" w/ V2 l5 {1 |# L* S3 Y 5 t7 W: i, T4 z2 V: ^2 o3 w
data_extract:    ;数据恢复
" @* s0 q' v7 k  { PLA5 z; {6 l- l5 ?0 g( l) W
TAY) O" S  [" k* K
PLA7 P5 N% ?# e3 t) U% M* V
TAX
8 s2 u9 w0 i3 G PLA, L! h2 K/ J; z, K
4 \# D3 `- G: p- C
return:
& o1 H6 e/ H/ s RTS
9 A& e" o6 A; m  i# e9 \, b$ l 0 e, n& F( c/ N8 j
ora_data:   ;按键相或数据( J% v: I) {* ]  s( A$ m( [
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
; C. l! f. C( G# k% P( z! Z9 }and_data:   ;按键相与数据* b' N/ G2 m! \. y* y4 R7 q
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
  v3 i! J$ g1 \4 u) `/ g! x
( Y7 h+ Y" ^& ]$ }" ~* P$ Y $ F5 }. M9 n# g0 p1 T: m
2 h5 u$ H/ r! D, b  r
;FC数据搬移程序 BY FlameCyclone7 ^3 @3 V: J& `8 V
.ORG $8200
, E- H; j% O% B2 A, O JMP DATA_COPY_PROTECT0 M; v3 Y! j; `* v  X& R
  v) ?& i6 ]8 s$ o: y5 F
ADDR_DATA_TO = $40    ;目的地址" m5 h: s1 r1 _
ADDR_FROM_START = $42    ;源开始地址. L. B* m7 n$ `& a
ADDR_FROM_END = $44    ;源结束地址
: }3 o; B+ g( }- x; S. @0 f4 \' T7 H! i) ~$ h
ADDR_TO:    ;目的地址
' X" H* n7 }8 T' T8 }/ p# v .BYTE $00,$70
. T) r( I. k# A' TADDR_BEGIN:    ;源开始地址( K, }0 V% E6 V  g
.BYTE $00,$83$ \" B+ F9 t6 D
ADDR_END:    ;源结束地址7 P" [$ L7 W' v
.BYTE $FE,$84
8 K% M/ \8 K% J# ^9 ~+ H
3 S" U( x7 Y3 q$ T+ r* S4 t1 N$ k) JINT_ADDR = $08    ;中断地址
# C1 M+ I! N4 ~" {# |; xFLAG_OVER = $71FF    ;完成标志8 |: l: Y, N( T' z1 I  B
. Z& I. ^; h3 n) I, Z
% ~0 l7 c5 I1 c5 h- |3 Z
DATA_COPY_PROTECT:    ;保护数据
6 e; |: z6 g( _  v+ b7 `7 p  y PHP- O. ]5 ]6 B3 J
PHA
' |8 a1 [- D# v! ?) K8 c TXA
3 e8 ^/ E" [3 Q4 J PHA0 `) q, s$ y7 b+ @8 Z4 u
TYA
# F& @, c2 B' N. p PHA. \7 G) z3 P7 u; ~+ y
LDA ADDR_DATA_TO( `; W; }3 i0 G
PHA" M. G7 \6 w: P" C6 A0 r) _
LDA ADDR_DATA_TO+1
: L1 x: J+ y6 R+ l PHA
! |0 D3 w2 G. C0 [ LDA ADDR_FROM_START9 v  z/ U+ p4 R: q/ o
PHA0 U, s( \( m" h
LDA ADDR_FROM_START+1
, a) J1 d9 U+ ]% L5 h0 m7 A PHA
+ k* s$ Q0 Q$ f7 T& n LDA ADDR_FROM_END
& m8 ?0 u0 p6 M! t( z7 b PHA
2 F2 A3 O% S* B LDA ADDR_FROM_END+1
/ l% J, {6 Z0 a/ |; Z: U PHA
" X" G! J, V  _( g4 X0 ]: O 4 M" e; V+ z# H
OFF_INT:   ;屏蔽中断, }: L0 V) C3 a5 P' \
LDA INT_ADDR# E8 a' J& A1 X. v! M* V4 Y% T
AND #$7F
% g6 a/ T2 W% h' I# g/ \& p STA $2000    ;屏蔽中断
. d  B  z. W+ {/ D, i
/ G' p8 x' B1 c5 B; V3 n/ B! v! | " f9 n% M9 p* k% \  @
SET_DATA_ADDR_START:    ;设置复制起始地址
" d2 L. Z2 a$ S, b LDA ADDR_BEGIN1 N. N4 f. Q! X4 S+ `  }
STA ADDR_FROM_START    ;设置复制起始地址低位: `0 V& p1 c+ Y# O  F: F
LDA ADDR_BEGIN+1; K7 K: v+ ^7 {7 ]7 Y  \3 E
STA ADDR_FROM_START+1    ;设置复制起始地址高位
3 i2 \% g: g/ @. E2 D6 R
7 I/ S  ~4 ?, v7 ^# KSET_DATA_ADDR_END:    ;设置复制结束地址
3 r. E. F" }: K1 U LDA ADDR_END/ V! u" x# L* Y- }2 `( v# G4 d: s
STA ADDR_FROM_END    ;设置复制结束地址低位% z' H1 G( {0 C! ~4 [( y
LDA ADDR_END+1
9 K3 o  }1 u3 Y0 k STA ADDR_FROM_END+1    ;设置复制结束地址高位5 n* z3 u# ]; h2 f/ C
% [9 h- T- q0 l4 D
SET_DATA_COPY_START:   ;设置目的起始地址
& g' D7 G/ ~: E$ G LDA ADDR_TO
5 c6 [4 Z  \9 s7 O" E; q. _ STA ADDR_DATA_TO   ;设置目的起始地址低位5 t2 H2 z& ]( k& P' e
LDA ADDR_TO+1
0 x& n9 D; T: r' b& X* x3 X9 ~2 l7 t STA ADDR_DATA_TO+1   ;设置目的起始地址高位
' |, U* A3 B% u5 K" b4 i2 i . Y/ J( d1 z( ?0 V) t
OVER_COPY_CMP:    ;复制完成比较* F7 N$ d% c$ ?
LDA FLAG_OVER& f8 \& u1 i/ q: a; B
CMP #$FE    ;复制完成标志比较
% C5 k8 m, X( ~( U7 T# }! i BEQ DATA_COPY_EXACT
9 V  a& U/ d. L% N/ Y8 ?$ ?- M' C' R( [& a! z( W; `  r
INI_XY_COUNT:   ;计数器初始化6 I& T2 F! t# Y
LDX #$00- F. ~+ J* s" j3 m6 [  n
LDY #$00' O) l- y' M! g& a

$ j2 p# X) R& a- |- |( e, A/ sCOPY_OVER_CMP:    ;地址比较8 y: L# l- ], k" `. P
LDA ADDR_FROM_START
( ~4 g# h% n0 C1 j$ p/ A CMP ADDR_FROM_END
6 N& F& w8 i+ e, m6 o- t$ p+ Q BNE COPY_START
& d9 V; K5 @" c  `; s; _ LDA ADDR_FROM_START+19 n+ x) U. ?9 ^7 W) B
CMP ADDR_FROM_END+1
4 ]) R# o, H1 s( [: ?9 x BEQ COPY_OVER
+ u$ d/ y. L- p
' b  a6 o* T0 K% s/ y$ _COPY_START:    ;数据复制开始
' \/ l( H0 O/ d! X8 c( }6 Y LDA (ADDR_FROM_START),Y    ;读取源地址6 b% j/ p; r4 y) o5 J
STA (ADDR_DATA_TO),Y    ;写入目的地址
& a' R; r8 J* o/ k' }) S INC ADDR_FROM_START   ;源地址低位递增0 z! Y9 S  {3 p
INC ADDR_DATA_TO   ;目的地址低位递增
" `7 C" B0 U. q, m BNE COPY_JMP
: o3 }& Z. z; F8 Z INC ADDR_FROM_START+1   ;源地址高位递增( V/ A. K4 k* T8 h" z7 o' {
INC ADDR_DATA_TO+1   ;目的地址高位递增
: E; Y5 R' i$ B* H2 G: F ; O- b# D3 _; F, O$ I9 M
COPY_JMP:   
( c! \8 f5 a" q4 P& I1 E9 u JMP COPY_OVER_CMP0 }- q9 ]/ `  F

" a% F0 D3 ]- V. mCOPY_OVER:    ;复制完成
2 {) ~' |9 J! n LDA #$FE  |& `( N; x% u1 D9 l' @% G
STA FLAG_OVER    ;写入完成标志
; P4 {: d7 c! l# a; kFINAL_BYTE:! D  {; k$ i2 w! E6 w
LDA (ADDR_FROM_START),Y    ;读取最后一个字节
6 Z2 c/ A# S  K STA (ADDR_DATA_TO),Y    ;写入最后一个字节
0 b9 o2 O7 _. }% E
( [. ]4 R7 z5 d$ ZDATA_COPY_EXACT:    ;恢复数据5 ?( E2 H0 ~( O
LDA INT_ADDR% @( T' z0 U- i/ s
STA $2000    ;恢复中断1 p8 P) `2 s& y; t4 s6 B
PLA7 ~! a% u" T, M1 D9 y3 S' ^. ^
STA ADDR_FROM_END+1: E, R5 R: M1 ?- {; |- T$ |
PLA9 Q+ }& D0 K% Q4 v5 `9 }3 y5 S. x
STA ADDR_FROM_END
8 k; M5 W! K7 A( b2 C" B PLA
; h0 \4 q- j- V! q5 Y/ G* R; J1 B# W; _5 G STA ADDR_FROM_START+1
: B  G1 a9 N  {' W: M PLA
* U) i% }0 C9 j5 ~ STA ADDR_FROM_START" n/ c; i; g5 f! z" q; ~  ?4 o
PLA1 R, _( D2 A# F
STA ADDR_DATA_TO+1. F) p( p( \+ m/ h& T. `
PLA
& J8 a- E/ C9 O0 v STA ADDR_DATA_TO; ~7 e" `  Y" w" x* I; g& f9 H
PLA" [7 S% {" k6 M+ \+ t
TAY
( _  @) o" B! `+ J PLA) I2 P2 a' B! U: f, b/ z
TAX3 U3 s, M0 }/ |: d7 q/ P
PLA! w% h" |- J# O( f0 f  [
PLP* h4 s4 h% N  I) Y. T" |- a
6 X- W3 O) w! s4 f4 _* T& c
9 f, p7 c9 X  y

8 W8 {2 h8 r9 `: N+ QDATA_COPY_RETURN:; m/ L* t* \: H
RTS5 r% ]3 E& \: t7 ]
% g) X: P3 s. i- M
.ORG $C056    ;精灵指令覆盖, H% X0 @9 t9 [: J, Q8 s+ K% B
JSR $FFB5, e' p" Y& [# K) B

( R# V- z* H4 a, D .ORG $FFB5    ;
3 y3 @* d8 I) K9 u' e. \2 C/ g! J PHA. z( A, _. p/ I1 b& {$ R3 j% g
  TXA
* h; J5 {$ E0 Q2 G2 N, `* H PHA0 T, R% @' e; R# I
TYA
3 D8 P6 o6 T8 C PHA
0 B2 m: b3 i% O% d' a" u LDA $71FF    ;比较7000-71FE数据是否完成复制
0 B3 g( Y9 Y4 }& [" C CMP #$FE$ q, J) n% ~$ `9 l- G
BNE ADDR_FFCA) o& K. D4 H% U9 T, Z/ S  ?
PLA4 e" H+ [7 w1 R: w% |
TAY7 B1 Q- C& R6 Z0 u
PLA
! h: z) J" I& T" i TAX" Z7 a$ J* I- t) g2 m. V
PLA
/ a; I' k2 W6 \. x) f JSR $7000   ;跳转到自写程序
# d! ^5 E3 Y' W1 V$ g RTS( Y$ h' q  g: d2 m. A
ADDR_FFCA:6 a) `2 @' k& D6 a
PLA
# ~3 s7 w# H- C# ~5 {% M: i1 P/ _ TAY
: D9 E; \. W* y PLA0 ^# ]8 N3 e" |' G+ `
TAX( D/ z: P1 K6 M/ E3 j
PLA
* ?$ b6 I6 @1 J0 Q7 v$ M$ p! @ RTS6 V2 C, W  t! _
( U' v3 _' T) Y5 t
! \  {" e  U1 o- r: y' @& L0 ]

# @% H2 P. F. X# X1 [0 ~) f .ORG $C264    ;自定义的MAPPER2切页程序* t- r6 c" K& P/ |
PHA; Z1 \4 B3 Q& x4 Q, R/ N7 h
TXA6 S# f9 A9 f! ?" `' S, C
PHA1 ]  N$ u2 W7 x6 s
LDA $0066
1 O' M; Y# {: N, R9 x BNE ADDRC280- R. A# d1 Q: _( J# |- C9 ^; N
LDA #$073 K2 W* E+ D& c2 p/ u
LDX #$03
2 ?" C) }4 u# \2 Z) @1 [ JSR $CD9B    ;自带的切bank方法# S% o$ d, r  H. A. \- `
PLA
+ {% P; f+ ], U$ K- H TAX" v1 ]" M  |: Q* W% n
PLA
( s- [" S2 X) p7 A; I! p  B+ z JSR $80007 ^) G, k: b8 J
LDA #$067 i8 O9 p4 Z- j* r, ^( J) G
LDX #$03, p/ `/ |  w) l3 D) M/ c
JSR $CD9B    ;切回原该切得bank(可以不用)
6 P3 \- M% f9 V# @ RTS
# P  |" x% e: m6 ^6 E3 ~ADDRC280:# }% K4 o/ k2 u2 O5 G: X' s9 w9 G
PLA
  S" J6 [' g$ n% w0 d# r/ c; y TAX
; z" o$ h, z) t! W PLA: B7 {7 u0 D' y7 v1 y1 z6 }0 I
RTS
6 W- u) ^9 B$ O- G- S+ R( o; | 3 {3 g" k) v8 ]) B" n* a1 g

1 N. P1 l# I' c) [8 Z;[FC][最终任务PPU][END]+ y+ C! q6 J+ D+ k3 G9 s
.ORG $C056    ;跳转到PPU重写程序
: U% p0 D0 e. N" k0 v6 I JSR $70003 W/ U- N- f/ a5 |, i- _# C" e: N
9 k& i3 ~, W' I) @! l
.ORG $CEBF
% @3 w6 }8 d- Z! G' C JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
: J6 S/ x; ?* i' V/ C# d0 f9 G  
( \" j( X, E1 a, {  V  .ORG $E4603 i# ^1 |0 j& q7 h- q
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入
5 X4 B% ]# w5 r. M% L! y  
. V3 O$ f; v" W1 U  h: d .ORG $71F0
5 ~. U# v5 w1 k! v6 Q6 lSTAGE_DATA_WRITE:7 O& P" v: x8 V" N! ~. R
  LDA $6010
8 X* O& Q: E8 p+ Q0 L- D8 _) N$ \  STA $1E    ;关卡写入# ~! w. k& B' @7 Z8 x9 Y
  LDA #$00& }/ P. Q0 V: ?) p4 p7 u3 f
  RTS
& j" N4 I6 E' Y' O .ORG $71C0
4 a4 I2 K) B  ?  ABULLET_DATA_WRITE:    ;副武器数据写入9 z, j2 u& N0 B
CPX #$0E
0 ?  w$ x; M* Y6 [* a$ g BCS P2_BUL2 Y" F8 }! t) n- S
P1_BUL:1 ~* |3 n$ ^- X* s/ }
LDA $6004
( R, h0 Y  ~( `: _ JSR $D7D0    ;P1副武器数据写入  r: L# j$ V# e# j; Y1 j
RTS" d; i  K' w5 z8 n6 D- r' O) V
P2_BUL:' Q8 b& e0 \$ x  v
LDA $6005
2 f- g% f3 o7 |: n JSR $D7D0    ;P2副武器数据写入# Q; b! ?1 A, y
RTS
" C7 z. S) `5 H" D$ B- w( j2 I( _0 [" M) R

) L" O4 u' T$ ~# c2 g' B' d .ORG $7000
4 B3 t$ l5 O" X  
  z6 n- Y( C9 \' @ STY $4014    ;补上覆盖的精灵写入指令
+ N5 O+ X; G# ~% F PHA8 Y' G: Y" E+ p& Z3 A% |; P4 H0 ]" a
TXA! `* H: |' [( J! \& ?$ ^) r
PHA& |5 W) V" \) V6 @  O/ d/ I
TYA
- r: V( w. Y* T3 d" G0 a PHA5 s1 ~( E, g3 k% i  D/ V
LDA $0C
; E7 E2 o9 N6 A! O3 u7 e: { CMP #$01    ;比较是否为标题画面
* K: g# R# e5 M/ P6 F, N& l/ Y BEQ PPU_STAGE" a0 ]( i" ~, Z- U# l
PLA
/ a) _9 T( W0 I& Z" p, S TAY
# z2 G1 z+ L& g, {% b" j PLA
- k8 ^1 A( c( _% I: o& P TAX4 z9 ?# [% r/ u) f4 {
PLA* O  A5 {0 l( L$ v/ g
RTS5 f# G7 n! E+ n; p* r9 s- z
PPU_STAGE:    ;STAGE显示程序
( T/ X8 T( l4 ^! y! ]" d LDA PPU_ADDR_DATA: s3 X+ C0 v- U6 r; r$ W
STA $2006. N& [8 b$ G" P9 V  i! y
LDA PPU_ADDR_DATA+1
3 j8 h9 U$ U3 {4 n' M7 K STA $2006    ;坐标设置
4 K1 j0 J8 ^& }, s+ C5 P. P LDX #$00
& H2 w( v! B6 M: b2 Z5 wPPU_STAGE_WROTE:    ;写入STAGE字模  k) ~, B9 t' [- x; P# t0 V
LDA STAGE_DATA,X' ~6 g( }2 r1 w0 E
STA $2007# }- z2 s* o" E
INX
' j) g% R) G. m/ T4 Q5 w" ` CPX #$06: y+ G& \+ u1 b5 _; G3 K' P3 y9 _
BCC PPU_STAGE_WROTE" X9 V+ G" }0 M. C
LDA $60104 d) ~. ]% i8 [) c5 x" Q  R6 U
CMP #$FF    ;关卡数据初始化条件判断
8 L) W7 O% E, E+ x. W2 t BNE KEY_B
/ B$ N" M( w/ ]! z2 q/ Q LDA #$006 s5 S# G- K+ |! F! y$ Y; w1 n
STA $6010    ;关卡数据初始化
2 L! B% \5 M; F# o& H8 }' x" \$ cKEY_B:    ;关卡减少* a. h; E+ H9 o! q4 Z6 E8 |2 E( w" ^
LDA $04
5 k1 s, K* U  q) [0 \; R AND #$42    ;按键B或左减关' c: \" a8 W8 ^" O1 M
BEQ KEY_A
' K! A" `% p. X# h3 s1 t, P LDA $6010
$ i" d1 d) b' k' y$ u  L9 M CMP #$00    ;关卡比较
2 i' W  S- b5 R. ~( h. l BEQ KEY_A9 }5 U' M( u, X8 j7 S/ O$ J
DEC $6010   ;减关
3 p* G$ l9 N4 {( [, lKEY_A:    ;关卡增加
6 Q3 a0 K( k  F0 U5 {! s1 d LDA $04- ^# `' C( ^$ i$ y/ O0 W" b8 h
AND #$81    ;按键A或右加关
; Y% [: v6 B3 I  a: J2 l5 y4 l BEQ PPU_NUM_WRITE$ _) Y& F. w2 j6 P# K" e) I
LDA $60106 P7 a# V9 I+ r6 V! U! \
CMP #$04    ;关卡比较3 l: R$ r6 {: g$ K9 ]$ Q6 T, J
BEQ PPU_NUM_WRITE+ t8 [4 x% M# b0 [6 y1 [' v0 i; Y- `
INC $6010    ;加关9 H0 p: `+ }& \+ O7 o
PPU_NUM_WRITE:
" ]$ l( @" n' c/ q, m* H* r LDA $6010
3 {8 U& I& o# D8 l( c4 [ TAX
9 T! x  Q" S) T) P LDA STAGE_NUM,X    ;写入数字
& ~/ ?/ h+ w8 X* W1 P STA $2007
& H. z2 L* V  x. p, |  X  GPPU_RTS:
( C" S9 G1 _% I( p  z PLA" N. u; k* Z: ~8 X! I+ M( {3 p  p
TAY# E% l3 X6 L* J3 v5 B
PLA
) S' s9 p. @+ _2 |/ x TAX
( S+ }6 t# _2 B$ y PLA
9 O+ @4 I) j1 F+ P& Q  S: i+ ]# ?  M RTS3 Q8 u: G2 x$ H4 J; u7 ^; W& A5 S

3 y# X, Q) Z  x" L% Q8 I# B
) n. e5 F8 N0 q2 gSTAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据
1 y' E1 A' c5 _. c, V .BYTE $EC,$ED,$DA,$E0,$DE,00
& Y2 A. {( U3 J3 s- F: U/ U" ?" d+ FSTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据( f9 C- T, X' v& v
.BYTE $D1,$D2,$D3,$D4,$D51 V2 y0 `; U: x, y0 ]: \% d

% Y1 g- S2 A4 W: ?# B; a7 QPPU_ADDR_DATA:
4 l6 W' t' F/ p0 D/ `( i2 t5 U9 _ .BYTE $23,$0C
6 A1 C6 S5 x- }/ y8 x7 K
) J1 m, h6 w- p! {7 B. c

本帖子中包含更多资源

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

x

签到天数: 179 天

[LV.7]常住居民III

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

本版积分规则

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

GMT+8, 2024-5-5 11:07 , Processed in 1.125000 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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