设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2017-3-30 20:35:15 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
0 @; k; W* G' X( r
2 T, y. F6 h! b' l* f4 v+ l3 \- ]得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.. I2 p$ o8 x: d4 h* i. Y$ M! w
然而,今天想到一个思路.
  `, M7 ?: u9 j( W1 c1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
7 u9 X, M/ L) L3 S2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE* C5 Z, V0 N! x# P
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
2 K' l: i- C& ~% i6 b; D% }3 `! f8 x9 P8 Q) Q4 f$ ^7 C
* a5 x$ w& ^+ U% E- @7 Y( E4 v8 s
;[FC][最终任务KEY][END]
' E) C' i3 ?& u9 B# Zbutton = $04    ;单次按键$ ?" ]: ]. X6 W7 m+ _6 x  X
flag = $6000    ;功能开关标志3 h0 |0 E9 I! x8 h6 N4 l* n' k( _
pause = $000E   ;暂停地址
; h5 l7 q1 m4 y2 ]% Q2 C) N4 k3 j6 R0 A1 ^& I. M/ m3 j
.ORG $8000
3 w$ B' G( A- v; M LDY #$08    ;自带的按键程序3 z" P6 I! q; B, k
ADDR8002:" Y8 Q' H5 z/ R+ k3 d
LDA $4016,X
' O. I: E5 W' l; F LSR8 A) N2 F2 M1 a1 O( F3 j
ROL $0021! f. Y' I5 ^: ^$ Z/ J% }4 r
LSR
" u/ S1 p" L! [ ROL $0029( _3 ?/ ^# f6 T! Q  I) }( J6 u5 g
DEY. K' \9 N3 I2 A8 t' o0 o
BNE $8002
4 @9 D# S4 s- v, ^; A" k+ n LDA $0021
* r& B% W# D9 R3 y ORA $00298 u  M1 c* X- n' S
STA $0021
4 u8 P$ s( @4 T2 ~. m; a LDA $0020
4 h$ @& f1 a3 C# E  Q# X% {8 M8 W. y AND $00211 f4 t+ I4 Y9 \
STA $0020
# R- _& }- r1 Q% _0 i4 f' V LDA $06,X
) d! J/ ?; M/ T; x9 }8 F$ k EOR $0020
6 r. s. E7 |4 N. ~: S$ r AND $00207 v: J5 k" k5 w4 a  E
STA $04,X$ z' q0 }3 r( \# E1 {+ A
LDA $0020  b7 M2 o/ W  @$ p! G
STA $06,X
6 ~' v1 j" a1 q( \6 e$ l JSR KEY_OPERATE
! `" F$ H, l0 Y& m JSR Function    ;功能调用- U3 B% h8 k4 B0 u0 m$ E
JSR Weapon    ;武器切换调用! X! N) |7 S+ K6 c7 ?- Y) E
JSR Power    ;威力调用$ l  p& d. v( Y- r" W% i: i7 \( T
JSR BULLET_NUM    ;子弹数目6 x, F/ J' D8 X5 L- `3 |2 J
JSR BULLET    ;副武器类型
/ [9 F( H, b, V7 G RTS  q) |) N5 o: r# M
3 w; ], _! {$ n' k3 N5 X1 P9 Y5 [) G
9 u$ V; A$ h: H, n: E. N
+ D3 E8 T  D2 j# _& G
.ORG $8050
% O, ~9 h( U* nFunction:    ;功能
% t  F' U' d+ D' gWUDI:    ;无敌+ \% u7 r, ^! n( g
LDA $6000,X* {( l2 @8 R+ W2 K
AND #$08    ;开关判断
7 l+ t" K6 J, j BEQ LIFE  @! D5 Q: a1 @/ w+ Z4 ^
LDA #$05: {. K6 U; x" d/ r
STA $05DC,X    ;无敌锁定! |0 U. \" C/ F
LIFE:    ;生命! p  L7 z% x' B1 |( I
LDA $6000,X
$ n6 Y, o. Q( U) f) t4 I AND #$04    ;开关判断1 k( a2 z7 p! F
BEQ FUNRTS" z8 h) F6 f' @  N7 G9 G: ^
LDA #$05
  K2 n& z& A* o3 O! s  k4 O4 V. z STA $1C,X    ;生命赋值
) O, f+ F1 n* O$ N5 CFUNRTS:
% i  \1 W: {! L5 r2 V RTS
3 m' W. i7 Z3 ]2 L
0 L, g: c3 A" w0 ~# O# ?) ]" @Weapon:    ;武器切换
! H; L% ]4 ]5 N" X$ a+ M2 Y. M! Q LDA pause    ;暂停状态判断
2 B' R  b7 W  _6 P BNE WEARTS9 |, f( Y( s) r
LDA $04,X, |) V( K2 z: t6 }, n% D* Q
CMP #$20    ;选择键判断
+ P/ B' I; I9 F BNE WEARTS0 w% c, k7 L- j# G
LDA $12,X0 l4 _# P2 T7 R; G8 G
CMP #$03    ;武器值判断6 [% l3 z1 E* |: r" M
BCC WEAINC8 W) |- R, a# }3 U' v8 ]+ U
LDA #$FF
, L: g& d- t4 J3 |0 X) [ STA $12,X    ;武器重置- \) d9 G( J6 @) l
WEAINC:& X: l/ K  _7 B5 K8 Z  b- ^- V" e
INC $12,X    ;武器增加6 p1 |' L! W; E2 x$ n( Z, h- ]

; q4 r. Y/ S( IWEARTS:/ Q' R' V  f# Q
RTS9 R7 D2 O5 k% [2 E

/ M2 ^  V9 r+ r8 z( u. tPower:    ;威力: X" _8 O. y* V, }$ N
LDA pause    ;暂停状态判断! ?; W$ J; T* j+ C$ w
BEQ SPERTS
6 y. |2 G+ A% a3 H7 z: ^8 LBUT_LEFT:
9 D3 V! o5 ?; m2 i: A LDA $04,X3 O/ B; H: S; ~5 `
CMP #$02    ;左按键判断; @5 v2 L3 H; H3 a
BNE BUT_RIGHT
$ t! ^, H' u; f1 ?  w4 z5 I LDA $88,X
  w+ w( H1 s2 I7 \; c& P; t$ B CMP #$00    ;威力判断
2 i# _) S  v  N BEQ SPERTS& r) X7 z7 [  O# v" L  x5 I
SPEDEC: V7 C% I7 f9 l5 F5 H" ]6 D
LDA $88,X    ;读取武器值
. d5 }( u# r/ U* X SEC
; F: ^) h" i5 \. c3 `/ a& H SBC #$08' v' ]! m. s; t8 K4 g2 @
STA $88,X    ;威力减小: K+ Z( h5 [  y( R
BUT_RIGHT:
, t8 w2 r& e& B LDA $04,X* V/ Q9 w  Y4 Z
CMP #$01    ;右按键判断
1 M  Z" z; w5 z: x0 b2 q BNE SPERTS
$ d0 p5 w( t: p( {( K) M LDA $88,X* C6 u) ^+ v) a+ [" C
CMP #$10    ;威力判断& d5 L7 b" t9 f6 H9 S& q, e4 Y
BEQ SPERTS
. N! s: B8 G; v5 }- _, d3 J. ^SPEINC:8 T5 n& A! d5 B- G. Z$ R5 C# t
LDA $88,X    ;读取武器值
+ K1 _) L& V/ O0 {) l& d CLC# S& f/ a# `! V. D. p. r% l
ADC #$08
0 Y* I- w, a: F9 p STA $88,X    ;威力增大
) Z/ F2 k# h$ Q$ [0 ^& p
, V8 D2 v( D4 ESPERTS:9 C+ m9 k: z0 A/ _1 u, U
RTS. F1 t2 \3 G: v) R7 M

0 f  h: \+ k% |9 TBULLET_NUM:    ;子弹数目
# ~: T/ a; I# T, f( m  T$ K# b LDA pause    ;暂停状态判断2 x0 U$ l# \" G8 h
BEQ BULRTS
  n8 i! G: _9 b( |9 Y$ { CPX #$00    ;主机玩家判断5 x4 z, Y- Y+ p7 W: ?
BNE BULRTS
; t( k& G& p; z- ^7 V9 Y% m LDA $04,X    ;主机玩家判断
# J9 K! E' c/ `0 Z3 J, x8 s; m AND #$80    ;按键A比较' g+ I" e8 b6 M+ f; {3 l
BEQ BULRTS
% [# o# l# r, v/ y; h0 K LDA $87    ;状态判断
, B8 d+ `  A# ]- s$ V( L* c BEQ BUL_27 o1 i2 U% j2 e' r; N
BUL_1:, u; h8 [2 B0 a4 ?
LDA #$00
5 W; D' k* m) A; n0 Z0 M STA $87    ;1发子弹
  v$ O( {0 n' m( c$ [5 U BEQ BULRTS5 R' E- ^# ^! b' o: a$ V; H% ~
BUL_2:
- Y" H/ Y) p$ M# ~* y9 u1 P, U LDA #$01
) e1 }! {& H: z; m1 E STA $87    ;2发子弹3 O+ {2 r1 S" F: Y" P$ c* B# V
3 ^3 O  f  e( Y4 }" H7 Z+ F
BULRTS:
/ {' h# w4 K8 Q8 g; \ RTS
6 f; g" g4 K4 k7 Z # i3 }$ j1 X  e. w  m2 h
& s# j" P0 D7 l
BULLET:
% P* f0 b& M2 Y- l# L LDA pause    ;判断暂停状态
% |7 C* W$ i) O% U- g) F/ f BEQ BULLETRTS
0 H2 \0 e- b  ^6 t9 D6 J0 k) G LDA $04,X
4 r4 u5 B" z* `. x' R* I( q* f CMP #$40    ;按键B比较  \5 |& ^6 l/ I& |" }4 |
BNE BULLETRTS" w! e: w/ Q+ x- Y  |
LDA $6002,X    ;读取副武器
3 ~: U" v! @) G' [1 ^  v CMP #$03  w+ x! r8 _) c5 z/ h
BCC BULLETADD8 U9 a2 a- l7 U7 c6 J& I. r6 O- n
LDA #$FF
1 N# ]2 I$ P8 ~5 x" |9 E( k" c STA $6002,X) A! ]/ \- O6 G+ J4 w2 ?8 D8 s
BULLETADD:$ S% K; G8 {- I% v4 G
INC $6002,X
& ?  }% Y; b! {2 l " c  e. J" \* `& s$ ~7 H( m
BULLETRTS:
9 W( p; w4 {8 J) g' d" a LDA $6002,X
, I' ?7 ^8 g) Z9 D1 J) v TAY# q8 R3 [* A4 X) d, F( x
LDA BULLET_DATA,Y
) a% x" X! J0 p, R3 |- f/ D STA $6004,X    ;写入副武器数据! y2 Q1 e& m1 f  L0 [2 u
RTS$ b* U6 y) \& z7 x' h( n

; _; [* u% b1 Y  G% } % q: e+ z4 }5 c( a
BULLET_DATA:4 r( h- e& q. x
.BYTE $06,$02,$03,$04; R+ W4 E- N5 b( l' u

: B: x2 _% i' ?
8 g' n2 {6 ?0 w1 S+ L" N7 y
* D! ]  l0 o" |# S- lKEY_OPERATE:    ;按键开关操作
! V4 n& q* y0 T6 Ldata_protect:    ;数据保护
4 O: i3 }2 R; T) ]$ {) r" q3 m2 e  k PHA
# y: c8 p8 r( S TXA6 C& y( U/ _! r8 w$ b+ p8 W7 c
PHA# s$ _; {; B. E  F" u" Q4 Y4 m2 o! z9 }: T
TYA
. X( w8 o* J2 n+ s PHA
. e6 F' Q' p- ]2 a5 t0 @# K4 B- e4 F1 ~: Z0 `
FLAG_INI:    ;开关标志初始化3 ^9 D0 |, v$ U, m2 `/ E* |
( w9 N# i9 ?: L- V' i
LDA $600F# e! A( g! F( R/ z9 Y1 U0 H
CMP #$01
6 d2 O  M* U- p$ L+ l$ ~ BEQ pause_cmp
! A2 i4 A8 W5 t; r LDA #$00( V: e2 t/ E; _" d$ U, s
STA $6000' Y: e: ~, t* u! y5 H
STA $6001% n9 U6 ^) o: J
STA $6002
/ q' @1 W3 ~, i, ]: g STA $6003  u, o6 E; q" C: a; _/ M
STA $6004$ f- p4 M8 @1 R9 U9 ?/ x
STA $6005
+ I5 h/ W  |/ E& e) J/ _ LDA #$01% s& ?" }& y7 ^3 M1 |7 ~0 z2 {1 O
STA $600F, I6 n8 C0 T* i2 d! O& Z0 s
; G0 M* U4 N9 T1 Z# ]
pause_cmp:    ;判断暂停状态9 N2 |1 e& N; k7 E6 y( Z
LDA pause& {9 C* f6 Y$ Q+ _  O$ G& t
CMP #$01    ;判断暂停状态
5 K3 P, M( P8 Q5 }' B0 v; |5 v BEQ button_press
. g6 L* ^" {) H; G# q PLA9 R( h( M; x$ T* z6 Z% c3 p' W
TAY& ~4 A2 m" A5 X, o- j  X. J
PLA* f  N( E& a/ O1 @5 z
TAX
9 G9 T, O9 W2 J PLA* V% C, _2 {9 C2 T- x* o8 D
RTS
# I) i  s, _; e1 ^6 T, y' T* R! D$ K' ]  T% B% d, {* T3 j* L
button_press:    ;按压操作
) }" M0 ]" @' O" ^3 nini_Y:
% |" f3 g, f0 q& \% m  p- C LDY #$00
2 _& W, A% R+ W4 @button_cmp:
' o# N% T0 G; X$ ` LDA button,X" g, H% W3 X1 z( ?
CMP ora_data,Y
$ |. ~4 @0 q: A4 [ BNE count_Y_cmp
# r- N4 o3 N) @) ^+ k+ }flag_cmp:
( [3 [! y! @* E8 N LDA flag,X
  A0 q+ b0 g! w  Z AND ora_data,Y
  M& a; B" s1 [. Z  v' G+ ] BNE flag_and
/ \# \  P- Z5 o; q* T  E$ Gflag_ora:
8 X1 O( G" E+ ^ LDA flag,X
" c7 i8 \8 q4 Z! o+ \$ ?5 w ORA ora_data,Y4 o( `0 A% v( K# F* V8 _) [" u' O
STA flag,X3 q% Q' @( R$ n. W  d: ^
BNE count_Y_cmp# x7 s8 M4 E( I) }# j
flag_and:9 O  w# W- M" c* D0 x. {% k* `
LDA flag,X. @" m# N4 r/ X( B# N( I, ^
AND and_data,Y% r; m* S; i' V0 S
STA flag,X
7 c# h# P  d& v0 ]count_Y_cmp:
" b% y6 s0 y5 ? INY+ J) M0 n, e$ S& d" t! {
CPY #$08) g5 w: H3 T  ~; }/ A  S
BCC button_cmp
! i! x* `! }: x7 }5 b! b3 \* E3 |1 J
$ t' u. A& E& A' e+ h, G  `data_extract:    ;数据恢复3 b1 V3 A4 q4 ^3 |
PLA/ R) J1 s" o, W: b# k* A( A
TAY2 D0 P5 W% ~6 p) e) u
PLA
$ U) x% h! e* D( E( o TAX
  [, [+ e! Y! l PLA6 [) t7 C2 F. q0 o+ O; c4 H7 N
, N- P( `6 s9 N& j
return:! O) r4 i: ]! p" U! J, y
RTS
& x3 {7 K# Q, t+ G9 m/ A3 ~ 2 i& n8 M. ~8 f* ~/ i/ j4 g
ora_data:   ;按键相或数据& X' [  Z% y  t" J  ~
.BYTE $08,$04,$02,$01,$80,$40,$20,$100 T4 }6 p% g# X
and_data:   ;按键相与数据
& u) j- B- v( F2 R; F# V .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF. H: ?0 q) Z. l+ [/ }# i5 D
8 ]- H: y- p% v: T; f8 P% r

2 u4 ^2 s: F+ g, H6 B0 m8 i 1 |& J+ c$ |& ^, J6 ?4 U* X% h, X
;FC数据搬移程序 BY FlameCyclone
5 X" @4 z+ X, b9 T .ORG $82005 l/ G- s  }: L# [/ k3 Q' K
JMP DATA_COPY_PROTECT" I7 w' ?) D3 N6 d
7 P  Z& b6 ^& P4 p0 I, R. F+ c
ADDR_DATA_TO = $40    ;目的地址- t- n+ u8 O) _4 W
ADDR_FROM_START = $42    ;源开始地址
% x: Q# I- b1 n" ZADDR_FROM_END = $44    ;源结束地址
5 I0 G) }  m! v/ N2 L3 {5 W; y9 ~! K5 C* e9 O
ADDR_TO:    ;目的地址0 a5 c! P3 @. B; B3 E
.BYTE $00,$70; U$ T9 x$ g7 F; `  B( Y
ADDR_BEGIN:    ;源开始地址
2 T2 M) {) |$ ]7 | .BYTE $00,$83, z0 w: \- ~, S+ y: E" ]! s9 r5 L. g
ADDR_END:    ;源结束地址
6 u. k* L! [6 H .BYTE $FE,$84
( {6 x+ |2 Y" x+ l
6 D+ k4 O! P6 I2 U3 TINT_ADDR = $08    ;中断地址
, ]# }$ N  c% y* {FLAG_OVER = $71FF    ;完成标志
+ s& ~/ j9 k% U1 o2 d: ]  j. {  N$ p  h5 z8 c( b, ]6 l

& m1 W; }1 e. U9 c7 k: [1 E3 bDATA_COPY_PROTECT:    ;保护数据
9 t( g1 q2 K! l PHP
  K/ `( x& J! I5 ]1 D1 Q6 J- G* Q PHA+ S( C7 K9 ?5 V+ `3 _1 p* w& M% X
TXA
. I/ v1 ?8 {6 M PHA
- c: M2 O) c+ Z$ B$ ` TYA
2 q$ c0 c* M6 ^2 s" r3 ]( @% a PHA( R( y" k5 G3 Z0 F  p
LDA ADDR_DATA_TO
7 G6 G$ E4 q3 o/ i" Q/ o PHA8 |8 q9 Y( ^  U* [2 C7 B6 B. \" z
LDA ADDR_DATA_TO+1" R* Y8 ]* z; u; H' J5 o
PHA
- t& Z- U# Y- O# @2 C+ `2 F7 D LDA ADDR_FROM_START- B' b1 M9 P) M* Z$ m
PHA3 b1 L8 K( p. X# X
LDA ADDR_FROM_START+1
! ~4 `2 [2 T' D PHA
" f( K! G0 g. {( b# j( p LDA ADDR_FROM_END
1 u: ?8 ~" i4 {- G* M" _ PHA
7 h* C$ h! E" a: B LDA ADDR_FROM_END+12 D/ C( c, q8 B( p  `
PHA
& p; c4 @% T- e1 U; N
; S2 Y, P  _1 v/ N" A3 ~; }" j1 FOFF_INT:   ;屏蔽中断5 t# z$ @  G0 z% @. x8 V6 b0 |
LDA INT_ADDR' X9 n* I' d: p& Y" E! Y6 q
AND #$7F* |6 S7 u1 ]: O0 i
STA $2000    ;屏蔽中断0 V9 g) M: R% [/ e3 |( G

6 x% O5 @+ b+ G1 ~) T; Z( f2 ^   h$ q5 L  S) h
SET_DATA_ADDR_START:    ;设置复制起始地址: x: q% g* P  ?& a* t6 V8 q) N
LDA ADDR_BEGIN
- B8 ]2 P. e1 U2 D STA ADDR_FROM_START    ;设置复制起始地址低位, _) ?' P: T1 `
LDA ADDR_BEGIN+1: z; r5 @& e% C2 q
STA ADDR_FROM_START+1    ;设置复制起始地址高位. w& H* P! x2 {6 ~1 D7 P7 d" s

" L* w$ [+ G* `9 x; a$ CSET_DATA_ADDR_END:    ;设置复制结束地址. {# E: v# ?, L. B# S- x3 Q
LDA ADDR_END
7 M" R( n& l* I" k- R9 c STA ADDR_FROM_END    ;设置复制结束地址低位# T+ {# j5 ~9 z* X! P# F- e6 Z
LDA ADDR_END+18 a# N  R$ p& T4 ^' R" L: |" n9 `
STA ADDR_FROM_END+1    ;设置复制结束地址高位
$ j, }' d' x# F5 M( ~0 y8 {7 w, i8 f
* |6 O1 T$ T! s$ B% @SET_DATA_COPY_START:   ;设置目的起始地址: j) F- N+ b. P- O
LDA ADDR_TO+ W% C4 H3 i# ^: Q
STA ADDR_DATA_TO   ;设置目的起始地址低位. w, V3 W2 E6 w
LDA ADDR_TO+1
' k6 Y% o' E) D# o STA ADDR_DATA_TO+1   ;设置目的起始地址高位/ A4 T! R& `6 n3 @# ]. o6 Y

1 }* B' ^% H/ `0 |" POVER_COPY_CMP:    ;复制完成比较# @3 Y" I4 ?4 X
LDA FLAG_OVER' E% n) v4 b" p& m& S
CMP #$FE    ;复制完成标志比较
& |  q% ^) q) n- d BEQ DATA_COPY_EXACT; m, r6 _4 o: {) t( x+ d
* d$ E7 {  j  [) z/ T
INI_XY_COUNT:   ;计数器初始化' j6 D0 H& n! O2 {9 ^# e
LDX #$00
0 t& O- c$ A- P* O LDY #$00
4 m# [8 j2 O$ a2 ?! Z$ B  u - z' ^: }" m8 B- b1 p
COPY_OVER_CMP:    ;地址比较& e+ o1 k" H  P6 f
LDA ADDR_FROM_START0 U( f. G3 U8 Q8 y/ U
CMP ADDR_FROM_END
/ u# U8 M' J* e( z5 | BNE COPY_START
! e( D# f' R3 ? LDA ADDR_FROM_START+1
  E1 j# k8 `0 X CMP ADDR_FROM_END+1" I4 ]% N# d$ j- B4 u; u
BEQ COPY_OVER
) Z, j1 Z" t4 u  E . N1 i' a0 L$ f/ G: t
COPY_START:    ;数据复制开始# m9 B  G8 |0 p. T  p% X- e
LDA (ADDR_FROM_START),Y    ;读取源地址9 O2 \: {; D3 x
STA (ADDR_DATA_TO),Y    ;写入目的地址
+ i! W/ M2 P6 T INC ADDR_FROM_START   ;源地址低位递增. w% u# C6 a9 p/ P8 a+ P
INC ADDR_DATA_TO   ;目的地址低位递增1 z7 b& I) {' J0 m5 m
BNE COPY_JMP
# r! B( I9 H# C0 ]% ` INC ADDR_FROM_START+1   ;源地址高位递增
' R( u7 q8 ^7 t5 r5 r INC ADDR_DATA_TO+1   ;目的地址高位递增6 O* r8 A- a5 m8 Q: p8 b
4 d$ K9 [7 q# ]% }
COPY_JMP:    ; d7 B$ |$ k0 G4 r7 [
JMP COPY_OVER_CMP
" _/ b- u  B% t5 h2 G, B3 U/ _- ^
COPY_OVER:    ;复制完成& L- L$ M0 v3 m. V
LDA #$FE
! @6 c5 Q* U- s2 S1 H) X STA FLAG_OVER    ;写入完成标志3 |3 h3 P; m4 G( r2 Y5 j
FINAL_BYTE:
( ?, [" y/ x1 T$ z3 l9 F LDA (ADDR_FROM_START),Y    ;读取最后一个字节
5 {1 X: G$ u/ ^' r STA (ADDR_DATA_TO),Y    ;写入最后一个字节9 r" w' f8 Y- w7 i$ |$ G) N
7 M& k2 N: L1 H- Y5 w" l0 f
DATA_COPY_EXACT:    ;恢复数据9 k) B2 y0 ~! j- z# ]2 p
LDA INT_ADDR
9 }$ b2 R7 \7 n2 N, X/ ?2 E STA $2000    ;恢复中断
; k+ v# q8 Y+ B9 v/ ?% h; ~9 P PLA/ Y5 l3 U) u! v5 v3 l3 s% A1 b5 t
STA ADDR_FROM_END+1
: d# B! ~6 t1 _ PLA
3 z( Y. q; x( S. [+ g# L STA ADDR_FROM_END5 M1 d0 u9 O" k0 D! y3 E5 L
PLA
7 v6 b$ A5 A4 F4 K0 Z* @. D+ G  g STA ADDR_FROM_START+1. g- j( m- G2 f5 F, d1 s
PLA% S5 i6 }( Y3 R5 S2 B, ^! r
STA ADDR_FROM_START% q4 }* I0 Q6 f% v# V
PLA% \3 p2 }4 v4 O9 l: N: m
STA ADDR_DATA_TO+1- U" l5 e/ B( t. h! _
PLA# j9 }: d- E4 d: l# `- ]; \
STA ADDR_DATA_TO2 ]+ m3 s0 G/ M  f! `& @
PLA  O' d3 b- D( o1 ?6 C, F
TAY
& @/ w! R5 \5 M* {% n7 i PLA
! N3 w7 r: `/ }( f TAX  M% z- H9 b1 Z5 C; o# P# ]
PLA
; r  t- V. P# R8 D! l. A PLP* a7 v2 V6 e; \' j+ K
- H: p, H: e: H8 l# `. T8 ?6 O

, s1 ^# j7 E9 u/ c5 q- \ 0 O5 l6 Y! ]  t- y# Q
DATA_COPY_RETURN:4 w' S, L$ E  W
RTS
) N8 L( y% K! ]& o. x/ _
5 |3 _2 _9 \( r0 W* r) l .ORG $C056    ;精灵指令覆盖$ l8 y( G' H/ H- m* T7 i7 O; _; g
JSR $FFB5
( A( T5 d+ {4 G9 I, i: U; _- z& t
0 Z; C; J! q! ~, _, z; B .ORG $FFB5    ;
% W4 a1 _6 J- j5 @5 s4 L PHA, t" q$ I( y" `+ l/ v
  TXA
# G8 K8 e( L; W' z2 }/ V+ Z PHA
" [1 d' l, [0 b0 u# R& W TYA
. @, \$ o1 `2 X. s PHA
+ B4 ?9 q+ E. X  ?0 c LDA $71FF    ;比较7000-71FE数据是否完成复制
; V& v" P2 j' z* C CMP #$FE
4 D) r2 U1 @& n8 z BNE ADDR_FFCA
% @6 i* y* F9 ^6 i. F; H PLA# D% ?) n7 n6 _" _% D8 ?- x
TAY
% Q/ x6 A. \4 t; {; O1 P% P0 } PLA
4 f8 h5 h+ N. G9 m8 f  ~ TAX$ x  l1 \( j: j0 @7 ]8 H% }, a- j
PLA
% D3 {8 I) N* z, L1 O5 B* t% A JSR $7000   ;跳转到自写程序5 `  R/ N% ]( Q& g) E$ W7 u- B1 H# E; E
RTS6 x8 x% S8 c' G0 p: ~& Z; I! p
ADDR_FFCA:
( F% v: g: k# u, N- O PLA8 D) I: |* |' q8 _# ~, K( }
TAY* D" A  c2 T# q
PLA
* G8 E* J& u/ n+ }/ X TAX
+ Y. L1 D% d+ v6 V$ v PLA
4 @( l6 r9 Q  `9 J RTS$ }0 n4 h8 P6 _; e" i
0 @( `5 G4 f; f5 C
4 D6 r* S4 q7 m6 a4 L5 a; M
/ T% h& \- \% ^6 e
.ORG $C264    ;自定义的MAPPER2切页程序
: ?" K( ^& T# [1 _ PHA" a6 t& V6 P3 W# l4 u
TXA
% h! Y1 e6 N) \ PHA8 t& B8 J% u! X( r
LDA $0066
5 h1 O& Y, V: E" d BNE ADDRC2803 _5 J4 O5 ?/ O8 H! K" O! C
LDA #$07  y0 Q6 n& i, m% I+ z3 Z: W% O
LDX #$03
" `, I- @& p1 ^5 Y$ p* e3 R$ m JSR $CD9B    ;自带的切bank方法
) O9 R: g' h. ^3 R% c( o' e# z. i8 u6 d PLA
6 m8 S& R' f4 ~# `0 e0 ^4 Q8 ` TAX' \; @: O  \1 d- H+ g% d
PLA; K, ^5 {* A$ P8 ?# ^. |
JSR $8000! i1 \9 q" a2 j
LDA #$06
* ^2 x, ?4 o3 u8 I% z5 A1 j: c3 S( m8 U LDX #$039 X5 t+ J6 q& h/ q- Z
JSR $CD9B    ;切回原该切得bank(可以不用)5 P& r  u' T; R# N
RTS6 ^- }/ G" s9 d% A
ADDRC280:
! g4 a% o6 N- {* }3 Q PLA3 J% Q, c2 a' I# j/ m7 A9 ^
TAX
* q+ W3 ?$ o/ U6 u1 m  i3 {$ @ PLA% ]+ h4 t5 P: D- ~# M( g! L
RTS
4 _6 m8 r, o5 v, c2 R0 {0 G2 G
6 e5 x9 O6 G. D4 E$ Y + x+ O/ P: F; H: ]* J7 X4 q
;[FC][最终任务PPU][END]
2 A: |7 Y4 i# H1 B8 p .ORG $C056    ;跳转到PPU重写程序3 s+ R( d& ^: o
JSR $70001 I, B; d" J1 }. ], n6 F

# |4 B4 V: H: t  C+ D9 ^' e .ORG $CEBF
( i2 I- G, V4 K2 ?: c! @5 z, d: J& n JSR STAGE_DATA_WRITE    ;跳转到关卡数据写入
# m. y7 O* C$ @9 K% u7 |3 d) N  
5 F2 P& t; g! K" W* j  .ORG $E4606 W, o1 D) j1 ~
  JSR BULLET_DATA_WRITE    ;跳转到副武器数据写入! y- J5 `+ M, u
  9 E/ R' E) s6 `/ E, Z
.ORG $71F0
, H( q, Q6 M5 n! s* qSTAGE_DATA_WRITE:! t5 X8 G% t' |5 [9 l" }
  LDA $6010( U7 J3 s# G' |' C$ |1 z' v
  STA $1E    ;关卡写入
7 h7 U5 ~  }' N! O  LDA #$00  Q1 b) D" B8 Z- `2 f4 c
  RTS! E, g# n, h* x0 p( F8 i* ]% H  d
.ORG $71C0
7 C% {6 Z" e2 B# t- z; ?" VBULLET_DATA_WRITE:    ;副武器数据写入; c) f/ e( H$ X1 M- ?1 _1 R- l
CPX #$0E
1 Z' Q/ R0 m4 D- V9 @ BCS P2_BUL
0 J2 I# [0 D( M: b7 b9 hP1_BUL:( l, w% F) S/ t, \
LDA $6004
$ _2 O% U) l0 J JSR $D7D0    ;P1副武器数据写入$ T1 {* p$ W) j- O- [
RTS$ {# j0 q  c9 V+ b2 \
P2_BUL:: W( T. e) Q4 O1 u+ N& G4 X, E
LDA $6005
% ~& L. U0 Q+ ~& P3 m6 e5 s JSR $D7D0    ;P2副武器数据写入
$ r9 Q. i/ X" n4 |5 g RTS" X: Q  G4 p# ~" u

9 h3 b5 @2 @) C8 o
1 v: y: `+ l3 a( L9 A .ORG $7000
. a1 o8 [$ t- w  
- ^% C$ ^% X, j6 v' p STY $4014    ;补上覆盖的精灵写入指令
1 d  P8 P6 j: H: _" Z1 l+ n9 X3 |; J PHA
  c; e7 I' i3 ]/ F4 y+ ] TXA/ P( Y+ T  }0 u0 C
PHA
  K& Z- S1 \$ d' O0 {2 Y5 F TYA
6 U) c1 G' O* K; K PHA2 K% \$ ?0 V1 h& R; G- O, I1 X
LDA $0C* i9 ~0 Z8 G6 [4 a
CMP #$01    ;比较是否为标题画面
+ v5 ^! M. q: N3 _9 ^ BEQ PPU_STAGE2 L) v6 u3 a3 f3 N* w( Z% I
PLA
% R- h$ t" X. u2 A- e TAY
; R9 M4 r, S% Q- d( i( Q PLA0 ~! D" k. |( a# Z
TAX1 ~  ^6 M3 A& U" v- l
PLA& A- [) h2 L$ r9 j" l& p- H: t
RTS7 d" `  e/ x2 h7 i
PPU_STAGE:    ;STAGE显示程序
: N& s  F+ ?; t* F8 M; j/ X0 g LDA PPU_ADDR_DATA
- w" H* T( E1 E! I STA $20064 d% u/ \- x( p6 T# L
LDA PPU_ADDR_DATA+1( Z7 |/ T# m, }  m6 M
STA $2006    ;坐标设置/ j$ z& [- @- N5 i& w' \( M/ t3 Q$ L
LDX #$00
: J. m# R/ h, x- w# n' A" r; B3 @PPU_STAGE_WROTE:    ;写入STAGE字模; }" d' O; `. h
LDA STAGE_DATA,X
, f4 o$ ~% Q" c; q5 s5 P2 l STA $2007
$ v! z+ j* e: }+ i" h2 M INX
& h$ k+ ?! H& X' y: T CPX #$06$ s. N8 f) d% k, z6 j! R
BCC PPU_STAGE_WROTE  j. i4 Z# q& }( O
LDA $6010
7 R0 M( C5 ~. U) j; a CMP #$FF    ;关卡数据初始化条件判断( X, |" [) D5 k9 H# S7 v' _0 J
BNE KEY_B
! G# n% S- r  Y5 l" s% W# H# T LDA #$00
/ F  `  t" u- w, s  |. o7 t STA $6010    ;关卡数据初始化' y4 f7 w; `) u  U
KEY_B:    ;关卡减少8 l# i7 N: Z. i. g3 ], A
LDA $046 E& w3 }& F0 Z! P* m# k
AND #$42    ;按键B或左减关
6 P, K: r; Q" q% N# t" D BEQ KEY_A  m: e# R& T* c/ u2 ~
LDA $6010# b3 b- S. d3 u/ D2 f
CMP #$00    ;关卡比较
# `3 r! O9 r  z) E* n& J' g% ]9 w BEQ KEY_A; Z: I7 t# k  W+ _
DEC $6010   ;减关3 h1 X1 S" ?! \5 |* }  f
KEY_A:    ;关卡增加  I3 U/ ~  s/ d# I  K  a) `
LDA $04
( k' k7 r1 f! t" c6 O AND #$81    ;按键A或右加关9 I; g  b( A0 {4 p* e7 R) y
BEQ PPU_NUM_WRITE
0 P+ k: @: d7 z3 g8 E  s" i LDA $6010% y' |& u  W  `& _  M
CMP #$04    ;关卡比较
: l2 N$ h5 ?0 c# x BEQ PPU_NUM_WRITE
6 u, K/ N0 ?( c3 P INC $6010    ;加关
) `% u3 O0 `  I4 U; X& [! CPPU_NUM_WRITE:
& |! B4 z! I8 N7 ~) E" _) F LDA $6010
/ k5 `/ N2 x+ P TAX- ^! Z4 V4 H2 w8 x; z! D
LDA STAGE_NUM,X    ;写入数字
4 h7 O1 J" A  \5 N. u6 m: P STA $2007; [/ D8 o% e$ z2 e& Z2 _4 o- N0 p
PPU_RTS:6 `* i8 ?8 Q# j9 w5 i
PLA
, S+ ]! A: p" _5 d7 r TAY
1 c: ]- M, }( m5 T PLA
0 J, C; c: Q; L& _7 e) y TAX
9 l/ ~) c7 F8 T; ?+ ~: u* B4 a PLA
# w. l1 b% u$ l5 ~7 A. T2 x8 k& o RTS! j1 b: }& w& u0 z

: m5 o; l( Q  N/ w) x) U8 b3 t 9 b4 o/ F. `0 s1 A
STAGE_DATA:    ;关卡文字S,T,A,G,E,字模数据! y' W% q& v2 `. ^" K2 c5 v
.BYTE $EC,$ED,$DA,$E0,$DE,00
; [2 {8 @. ?" n* ASTAGE_NUM:    ;关卡数字1,2,3,4,5字模数据
% N/ M7 ~% j3 L* { .BYTE $D1,$D2,$D3,$D4,$D5& E! v2 s' s8 \/ L1 M3 m; x8 M

; @% H8 a: k9 sPPU_ADDR_DATA:
, z- v; h/ N5 t! I/ _ .BYTE $23,$0C
- W4 @* O; m# E% m1 y  I
( v3 R2 f/ r/ d7 R5 z8 a) ?

本帖子中包含更多资源

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

×

签到天数: 179 天

[LV.7]常住居民III

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-8-26 17:17

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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