|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
3 {, T9 S. C9 u+ L5 c4 L' D& k% ^0 {$ S5 [# m' E- o! U- i$ B4 ?
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.3 L# \/ O: t* P! C% B8 H
然而,今天想到一个思路.4 ^* m, Z4 _! J$ t& Z
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
3 T; b) V1 H; s2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE5 r0 K. l4 T* T2 N: a
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
1 A2 t; U8 [) f$ ? U% v Q6 z3 Q8 S% w
# U0 O8 ~% H/ R. q. g/ @; |
;[FC][最终任务KEY][END]+ W: Z( {1 V% N! Q0 e0 j
button = $04 ;单次按键, Q, [' R% D7 e8 ~* n9 R; R
flag = $6000 ;功能开关标志6 z& l0 _: K' S9 C
pause = $000E ;暂停地址) K8 ^, l/ y" X1 u+ Y" W! C3 r
. s! s2 a) A8 H3 ?& e: z- Z9 p .ORG $8000
7 z' ]- d# Q) n. @. U LDY #$08 ;自带的按键程序
6 ?6 k8 Q3 {6 `/ RADDR8002:, t Y' H; f/ y/ ?
LDA $4016,X( W5 m2 X) J6 f8 B. \" k5 P+ |
LSR
% T6 `4 d0 x+ @7 A ROL $0021
* M$ u7 z5 M# r! x LSR& s* |) H i; g v6 v
ROL $0029
2 G _4 K2 q8 B4 y+ n8 L DEY
: I: n7 l9 L5 a; c. h BNE $8002* C4 s# s6 ~! |: Q/ Y' X
LDA $0021
5 v, ? O+ L7 ^1 E ORA $0029
+ V& {% w4 Y ^4 K+ @ STA $0021
* X. n* e5 M. y3 Q7 G6 b$ P LDA $0020 A+ U$ H( O0 W' c) T
AND $0021' H H: h* I5 {3 y% q# o0 |+ `
STA $0020
9 v( E! v- q. v9 n LDA $06,X
9 i- E9 u* Q+ X EOR $0020& R, K {4 ` |* a
AND $0020
$ Y" o% ^$ m6 |' t9 H# ~3 g STA $04,X# e% M+ Y! S7 u2 D
LDA $0020. H+ E0 J( J5 y# C$ O
STA $06,X( B [$ d. @, T2 }% w0 g0 W
JSR KEY_OPERATE
2 F5 E$ H+ B2 Q r JSR Function ;功能调用9 k: r4 C7 T1 w; a2 J8 B" v
JSR Weapon ;武器切换调用
& N A9 r. [7 F JSR Power ;威力调用
\$ R' @4 h! d6 c! z) J JSR BULLET_NUM ;子弹数目+ ~8 B4 s( ]- Y! {& V" t
JSR BULLET ;副武器类型
& a* l' |+ \ p( Q7 [6 i0 i RTS
] a% F" T; V, g7 u
& G5 B- z# d K8 \/ x9 L x2 Z; P * e+ H4 T( ]! j( b
2 ]9 i* g- J- X; |- n- y
.ORG $8050
9 ^* X% J- s7 [) _0 F( \Function: ;功能6 h# t* X, Y5 p: ?9 @* ?: n# l9 ]
WUDI: ;无敌
% |* y }! }& f8 x' B3 O LDA $6000,X; u8 q3 H+ J/ T
AND #$08 ;开关判断
/ Z0 h& u% Q: e n) x; i1 v' q BEQ LIFE
" t% z' P( v8 O; B& | LDA #$051 X* ?4 ^$ D$ D2 z0 h0 |7 b
STA $05DC,X ;无敌锁定 E' I* n7 o! a. c$ g
LIFE: ;生命
9 q1 ]8 T: [: @& o( w, { LDA $6000,X
5 I* i8 Z, v' u3 o AND #$04 ;开关判断/ l8 J- {# p0 C+ J: I9 ^
BEQ FUNRTS! q6 @8 L0 `2 o1 G& W# S, m J
LDA #$05
4 b) x% l1 X& E3 b STA $1C,X ;生命赋值
8 k3 P; ?/ D8 X; x$ \4 J1 `FUNRTS:
: L/ J0 j% B, J+ k: I+ C RTS
' g# I* T1 C: S$ u
/ B+ U Z: e2 n2 m$ rWeapon: ;武器切换
9 ]9 ~7 w' s5 _1 z( s r: a LDA pause ;暂停状态判断
* b! l" W J: e) B/ r/ u2 i BNE WEARTS% ?& U# P8 z7 Q6 a* L$ l
LDA $04,X6 e) Y3 i0 [5 U' C& S+ R' V& i
CMP #$20 ;选择键判断: A& W% v3 c i T1 ^5 @! Z
BNE WEARTS! ?9 [% L7 x4 f% g% v g# ?
LDA $12,X/ b+ S8 T) F% U# s3 v! w' c
CMP #$03 ;武器值判断. x- M8 I4 M! S" r' V/ H/ L5 ?# a
BCC WEAINC
2 `2 l' h$ b/ {! H1 x" Z2 K LDA #$FF" e0 ^4 D6 T; p3 s8 I q: e' @# M
STA $12,X ;武器重置
, Q) I, n$ Y7 f; ^, O( ?WEAINC:4 b/ T3 U& G! r+ }
INC $12,X ;武器增加( N1 ]% a9 n& ~
! ?6 \% H% @0 i8 A2 O; ? u
WEARTS:
, z8 r+ `1 {: D' ^9 ]& N/ ? RTS
4 K6 P/ Q0 [( V! X * G8 v4 E4 B. y5 Q* W
Power: ;威力
+ E" A. h! ~0 l: ~* I4 {8 r% R/ ^% ^ LDA pause ;暂停状态判断7 b+ h* Z* `: s! L
BEQ SPERTS
0 X5 F1 Z1 ]( _BUT_LEFT:
. a; ~7 k( [: ]5 N4 L LDA $04,X! [0 I% A0 L' R) n9 M' L0 x
CMP #$02 ;左按键判断
3 i8 k4 l4 D( x BNE BUT_RIGHT7 }; P+ E( n' k0 I" [- M' L$ u
LDA $88,X
$ {" ~, w) n' p( N+ m CMP #$00 ;威力判断) S0 N! d7 Y/ {' t
BEQ SPERTS& }4 V6 @$ d ^* c
SPEDEC; y% \! f' ]! B" R; M7 ~% i0 Z" a G# u
LDA $88,X ;读取武器值
9 r! C0 o' d8 a7 l& g, m) l, y SEC+ q4 v/ _4 X4 L* L8 m, ~: j
SBC #$08/ Q2 Z0 D3 F/ B- x! c
STA $88,X ;威力减小5 K# J5 Y; r+ u' V) m2 R5 g4 A. k
BUT_RIGHT:
7 T ]& `& G+ K: j0 P LDA $04,X
* s# Z9 Q L2 s5 q CMP #$01 ;右按键判断 X1 O: w, `' K
BNE SPERTS
' B$ l; `! ~" l LDA $88,X
& ]" { u4 ]7 \2 ]7 \8 }) _ CMP #$10 ;威力判断' ^3 H: I+ Q8 m5 z
BEQ SPERTS0 l" z4 S) H, Y+ T0 ^- |: i2 Q( h
SPEINC:
( | k k9 ]1 H3 w: ^% C( u0 O3 y6 c; Y LDA $88,X ;读取武器值
- G8 u. B( Q: I CLC
' L# L+ I' ^: f$ s- \ ADC #$080 `8 Z2 q; z* k g k9 z6 y" ?
STA $88,X ;威力增大/ |! Z9 s0 @' a- y5 _* h1 x% f% _7 p
. c1 z8 M, O; t* A, nSPERTS:
& t: G; b% U# K/ Z4 P RTS5 |* t, ^7 `3 G' u- `6 o
4 ?9 b( I8 w( z5 K# j9 O5 g/ }
BULLET_NUM: ;子弹数目0 }# ?% U* Z6 p3 {. J
LDA pause ;暂停状态判断+ ^2 q3 n# k( g+ K. }
BEQ BULRTS
2 l# v7 l; B5 w y l/ Z CPX #$00 ;主机玩家判断2 ~0 e% W$ K) r- ]+ G
BNE BULRTS! f$ _6 E, ~1 r% M% c/ J: x& z
LDA $04,X ;主机玩家判断
8 x) n5 b. X/ P& [ AND #$80 ;按键A比较
; {2 F8 H, e b& ^# ?( y, p: e BEQ BULRTS4 W3 z, J7 I3 q1 P7 }. a
LDA $87 ;状态判断7 C* y, j" p7 F
BEQ BUL_2
6 q5 Q0 j/ o6 ?BUL_1:
H# e, x0 G# d7 J3 F LDA #$008 o5 S. D. ]: e+ z' _
STA $87 ;1发子弹" f6 \: S$ P# x" S% N# Q7 y
BEQ BULRTS
. e, m6 m" u+ l$ v# _BUL_2:4 Z$ S N$ Q) A( d1 m* |9 M3 k
LDA #$01
4 r' e; m5 q" a$ R/ E/ [8 R STA $87 ;2发子弹! G+ o& w/ @8 K. T6 e5 A
( Q# ^5 b% `, F2 d* ?+ Y7 n1 BBULRTS:
; T* P& o: A& Y8 O, l. J RTS5 s, b" @# Z% k2 I, P s& I$ t$ s
9 E% |' [5 R8 [, m4 ^" i0 |& J. k# t9 v L. `4 @- P: h. B; g
BULLET:8 X7 J: p9 E" V% V
LDA pause ;判断暂停状态
; Z( j7 T" U7 F, o* G BEQ BULLETRTS, J5 C. t: W, `- {3 C3 K3 a
LDA $04,X
9 T( s. N* s) o$ U4 G4 U CMP #$40 ;按键B比较+ t1 b3 L! ^; p. s
BNE BULLETRTS9 L5 j% a, W" H# ?4 B
LDA $6002,X ;读取副武器* X* S$ Q( C ~
CMP #$03
" z* \( {! E/ _8 k9 a9 h; J6 o BCC BULLETADD
+ ]+ {/ r- o; E9 ^" T9 U% a LDA #$FF- B0 J9 P3 ~! V) N7 u4 q
STA $6002,X
3 m( B- o& o5 c$ ~BULLETADD:
- z/ Z( \0 ?+ p7 ^ INC $6002,X: m d, R( o* \6 @' \, W) x
% Q$ t% m6 v. S8 I. @. b0 ]6 PBULLETRTS:
1 a5 d7 @. ~/ _) r6 [( w LDA $6002,X# n. X; a. }( n" ~0 B8 Q1 A
TAY
3 ^0 H( W6 i) [& F LDA BULLET_DATA,Y! G& k$ w3 V; n r8 r
STA $6004,X ;写入副武器数据" A$ `7 A' U3 S. }! y8 K
RTS
9 ^! q3 c0 P" X
5 j, [% ]4 ^5 n! u+ h
) _6 y7 y; R) t& CBULLET_DATA:) ~2 I/ y1 R& H( P
.BYTE $06,$02,$03,$04
5 A- w- [5 h; S X9 e- ^- e7 k6 X- M
0 a0 l3 I% }8 }
$ v1 w% `! ^: Z: o4 x# y0 U2 [/ \0 DKEY_OPERATE: ;按键开关操作
: Y7 r8 X. c* H4 q! k+ edata_protect: ;数据保护' ^! u0 g- B; q. N3 k
PHA
7 g6 _. l& O; p Y" A! X TXA
P7 C' s4 s' L. X G9 x. [ PHA) Z8 X2 U9 r2 B, ?
TYA
( h4 i' ^. p; N% m9 \ PHA
- M Z+ t9 T. T( L
2 h% F, c& [3 Y9 UFLAG_INI: ;开关标志初始化 p' e+ E0 W2 N0 |# ^# b; [! l
5 O, Q- H1 K, M; m0 ~& T LDA $600F2 j; A# q( K: }# K
CMP #$01
$ d$ d7 q7 D7 g BEQ pause_cmp S; ^) L$ Q9 P: `
LDA #$00
# V% F1 A8 O7 W2 d2 @ STA $6000
9 E- K5 y6 m+ u2 N5 d: T STA $6001
5 T' `2 K/ I" S8 A! ?% o* Q! r; ? STA $6002
3 J0 c8 i7 z/ W+ n STA $60039 Y' q4 r5 M2 W8 U
STA $6004& j" q2 s2 ^2 `6 T) W5 o1 D7 E# v
STA $60053 o- F3 P; x/ y- f; Q; q! b
LDA #$017 a7 {5 w$ z2 \
STA $600F
8 i& Q* w+ |) m9 D/ v: m4 b * V" Y3 H" U; f) S! Q$ c, d) y
pause_cmp: ;判断暂停状态+ V. |+ R4 S7 B: L
LDA pause
0 G P+ i# S- h1 `2 {; X( a$ [/ W CMP #$01 ;判断暂停状态
% A1 A9 U+ Q" v6 B BEQ button_press+ A$ B8 k. R2 a6 Y. [
PLA
6 X3 [& T# @9 y* \& v TAY2 A9 g1 {! _1 M0 O
PLA2 o9 m3 ]6 Z) T' e s
TAX& p/ E! |' l- {" @* S
PLA
' D' V; U% [* E+ Z; {" X RTS
: r% r8 E7 Z4 X- o* ?3 I: I3 G9 ]5 i8 O( j! ?
button_press: ;按压操作
3 W! R% w; T8 b# C7 w" l0 lini_Y:9 ^8 `" R5 O# s- ?1 [% s* C0 G
LDY #$00. U. p* H7 N: K5 o7 k
button_cmp:1 Z. U0 f- b* ? s2 S
LDA button,X4 X4 I. N/ V o: w, r
CMP ora_data,Y( N) d; d; |) r7 i7 }' p9 n9 x
BNE count_Y_cmp
$ @% ?- Q3 G Q5 o9 @6 Pflag_cmp:; }5 d; d! y( Q! x6 q7 V' |
LDA flag,X
: l8 |& G0 t" u1 I/ ?1 N: S! L5 } AND ora_data,Y/ W9 O0 s8 J7 E3 Q' H# g
BNE flag_and: Z9 s' Y* |, A: q: E, [- T' n k
flag_ora:) w3 c; X4 v" g C7 y
LDA flag,X
4 V9 B) e4 ?# R; l# } ORA ora_data,Y
: t; Z( e) U6 `8 D STA flag,X
# V/ K" Q" E3 `, D4 k+ B% n BNE count_Y_cmp
1 z$ y% M) }7 u# A6 l" fflag_and:/ ~* W5 ]4 k& f7 m# w, V6 {& M
LDA flag,X
( c Y/ C f W# \+ F AND and_data,Y9 |6 ?4 C6 ?' X4 I
STA flag,X
7 j7 t( ]/ ?6 }* u; G$ j( F0 x' Bcount_Y_cmp:
2 W+ C7 R. d1 y. G0 E INY# T8 r4 V$ E# a% q. R
CPY #$08) z4 f/ p9 E) U, a# _! W
BCC button_cmp; h2 Y4 _/ F9 \% f3 }
& ^2 q; g2 C8 J. S6 x9 cdata_extract: ;数据恢复5 L* @: ^$ }% K H! k- }
PLA1 L( B# L& B( h& y
TAY
& m* l+ h2 j: ^* p, z PLA
' \! g" p( V9 s TAX
- ~4 o* n' o% f% O4 B PLA
# c8 y" T2 ?: K) G / v9 q5 }9 x5 l
return:( L4 e) O9 I6 w4 H6 ~' y
RTS+ C* ?5 [# ?, I" p) V5 Q& ^0 ^0 c6 q
' Y2 x) e' ~3 s+ e, T9 fora_data: ;按键相或数据! q! A# h* {& n* G4 v3 x
.BYTE $08,$04,$02,$01,$80,$40,$20,$10( a% Z" |- T5 m3 _$ Q
and_data: ;按键相与数据
- ]4 a* \/ w1 l: J: l; h .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF' a2 Q3 o, X1 z# s2 p B0 |
1 e( ^2 ~. R H" R% N
7 z0 c4 Y; J$ Y( k4 o
u h0 x" R' o7 R3 M" Z0 ~: c& G9 `
;FC数据搬移程序 BY FlameCyclone
0 z* W7 s6 m x$ Z8 k8 M H .ORG $8200% W S7 B7 |. |' Y
JMP DATA_COPY_PROTECT5 @/ X( [7 S- R3 x' Z# e# K! e, m! p
% F, z. _0 u' l9 a* uADDR_DATA_TO = $40 ;目的地址
) s: d' L" a/ |3 G5 jADDR_FROM_START = $42 ;源开始地址
4 Q5 V& o1 V S! D5 mADDR_FROM_END = $44 ;源结束地址8 \9 g/ x, l" C3 c$ |9 Z
' p! v x, \0 h* sADDR_TO: ;目的地址- S) S% X! S1 [, U8 w
.BYTE $00,$704 B. Z+ Y. Z$ J
ADDR_BEGIN: ;源开始地址/ I) M+ k4 x. g, {* E$ N( S
.BYTE $00,$83
9 P2 N$ j _# |, \ADDR_END: ;源结束地址
) o1 q' t: ~) f6 |6 o, a* G .BYTE $FE,$84
& K: Q) Z4 _$ ]" e, R' q" H
: E% A( A; G; JINT_ADDR = $08 ;中断地址, D! x3 _+ r0 L& Q$ @8 E
FLAG_OVER = $71FF ;完成标志% ^+ Q, v* J4 G3 `: C9 `
( [* y. {0 ?9 ~/ ~* i7 D4 n( W$ |1 A
, q& Z$ \+ G9 tDATA_COPY_PROTECT: ;保护数据
% p$ f S0 y, Y PHP
4 f% N r- ~- B- s) t0 a. X4 A2 Q PHA! x8 y1 B* g, E# j
TXA3 T( w, N6 x3 u
PHA2 N7 P( V2 {& t6 r+ t
TYA' j8 {, @ x X
PHA! k2 B. B: | l# r$ [ S- C
LDA ADDR_DATA_TO) M3 C5 ?, W5 y0 i" b" n" E
PHA( }* C2 R1 v; f; O7 d- F+ ~8 i
LDA ADDR_DATA_TO+11 L) {) I$ r( u7 C- }
PHA
1 I( h8 s2 h0 K/ b LDA ADDR_FROM_START" t7 K- c3 u" e9 z
PHA3 M3 V) i" m! [2 t
LDA ADDR_FROM_START+1) |) }4 n7 N) i7 r5 s# C4 `
PHA
0 X7 i, A: r% E/ Q LDA ADDR_FROM_END
! s6 Z; u! f0 ~5 b, F; |) n- O Z: G PHA
8 ]# r; r; ~% l( ]7 |- ] LDA ADDR_FROM_END+1. r( y V* y8 `
PHA
& e' R' l: n& w/ `9 ?- B' m; r/ G # x7 C9 c2 k6 u$ F1 Z7 z
OFF_INT: ;屏蔽中断7 K8 q$ i! @' ^7 e& |
LDA INT_ADDR: ~' ?1 [. g, j; L( l
AND #$7F
1 U3 a# r" Y& k" ] STA $2000 ;屏蔽中断# T+ `* ?2 R7 a# g3 |1 ^. [. v# B, M
. s5 o2 g& a3 u Y p, g, V% _ b2 P- S" F. _0 o
SET_DATA_ADDR_START: ;设置复制起始地址: G: `% T, k; J' y
LDA ADDR_BEGIN+ E) x! s9 p6 B" x
STA ADDR_FROM_START ;设置复制起始地址低位
0 o( x! p6 n$ u$ { LDA ADDR_BEGIN+1% m% z8 F6 v9 Z: f
STA ADDR_FROM_START+1 ;设置复制起始地址高位
6 h' x2 d8 E% L7 n# D
5 f' Q# q- k$ GSET_DATA_ADDR_END: ;设置复制结束地址+ D) w8 W$ l* [$ A0 e6 w
LDA ADDR_END* Z6 _7 l: |8 x3 R% e; X! f' M! Z2 u
STA ADDR_FROM_END ;设置复制结束地址低位
/ T. s/ ]' o: q6 ?2 |) n LDA ADDR_END+1
& \: w. L0 Z1 k4 B STA ADDR_FROM_END+1 ;设置复制结束地址高位1 {0 d6 a2 ~5 G% E
0 N) C2 O, Q0 y2 h' H+ B# V2 _
SET_DATA_COPY_START: ;设置目的起始地址
3 w/ O& y0 _* j% _2 O( p LDA ADDR_TO
8 j4 ?7 n# \! { STA ADDR_DATA_TO ;设置目的起始地址低位: N% @' c4 l \1 X D+ m
LDA ADDR_TO+15 p8 S' v- ]9 G8 H7 c! d! l) A
STA ADDR_DATA_TO+1 ;设置目的起始地址高位
% \; b8 j& d/ _0 x% e# b H% D; z) w9 c" c# l& v
OVER_COPY_CMP: ;复制完成比较& ?3 u4 ?8 x+ e6 F9 k: Q& _
LDA FLAG_OVER
5 f( H# `6 ~. \1 [' k" U2 x6 w CMP #$FE ;复制完成标志比较* A. |1 t7 I" N
BEQ DATA_COPY_EXACT
3 f$ u: R1 \# c! G1 p$ M+ r7 `6 E. Y
INI_XY_COUNT: ;计数器初始化
: r \% Y! {% J$ f4 K( ^0 b/ D LDX #$00
9 X# c; `$ q) ?9 y, A6 H LDY #$00* {& Q X0 t& n' Z
8 h/ O2 t J5 E6 K, H1 oCOPY_OVER_CMP: ;地址比较 t& Z6 O( h7 F
LDA ADDR_FROM_START
6 m! R3 d( r6 h. i CMP ADDR_FROM_END
% a8 k7 _: p. F! N3 v BNE COPY_START
& T# U- a& P/ Q3 X0 p- j LDA ADDR_FROM_START+1$ Q' s) q, N `$ i
CMP ADDR_FROM_END+1
h1 e7 o# e$ Z2 c BEQ COPY_OVER
, k: F& y" ]) _- L
" e9 p$ Z( V/ B6 KCOPY_START: ;数据复制开始' ~$ W- ~5 P+ W
LDA (ADDR_FROM_START),Y ;读取源地址
; O* W& |0 u* E$ y1 z7 }# L" h STA (ADDR_DATA_TO),Y ;写入目的地址
/ ] t1 L: u5 m2 v0 R7 z INC ADDR_FROM_START ;源地址低位递增 V' l: X. v% f5 o! W
INC ADDR_DATA_TO ;目的地址低位递增
" i# d9 u5 U$ M: P BNE COPY_JMP* d7 u# X" W* I" r6 R2 d' @; ~
INC ADDR_FROM_START+1 ;源地址高位递增
" K; L% J1 I9 W, p INC ADDR_DATA_TO+1 ;目的地址高位递增9 w$ {: s9 I$ Y% ^# l- s% Z- h A9 O
* y. _) Q, X0 U0 w# M
COPY_JMP:
# w& u$ F; k9 p: J- y JMP COPY_OVER_CMP
: ]$ ^2 x- C+ S* O0 M6 ]
+ e* c. b, B5 ?+ t( T0 i: z( TCOPY_OVER: ;复制完成
) r5 |/ u; r7 v( P LDA #$FE! \+ m5 o* o; _5 x* T% @
STA FLAG_OVER ;写入完成标志
, H. k! h! n8 t. @5 eFINAL_BYTE:
$ r: x' q9 x2 q2 p4 a LDA (ADDR_FROM_START),Y ;读取最后一个字节5 z# ~3 m8 W5 m: R% x# ^- T7 `
STA (ADDR_DATA_TO),Y ;写入最后一个字节# k# E7 I, j8 \1 V
' k2 ~6 V7 v* x& N) p
DATA_COPY_EXACT: ;恢复数据. l' V1 Y; ^4 k4 T
LDA INT_ADDR
& \+ Z: K+ m" I, m6 o( e STA $2000 ;恢复中断' l' y- J) B* V/ s% U
PLA' G! Z3 S( M O3 q
STA ADDR_FROM_END+1 _& } Z+ f U
PLA
7 B( l4 p! J3 N; ~/ h& i STA ADDR_FROM_END. N' \! i7 E' E
PLA
7 @& U: H) A7 v- i( R* v STA ADDR_FROM_START+1' \3 `- A- j8 R3 m9 L! T/ o% ]
PLA
7 I0 l& [9 L5 u1 C STA ADDR_FROM_START% j- [9 r0 } f. X% y
PLA, Q! i5 h f9 a' _
STA ADDR_DATA_TO+1: |1 M$ w8 Z! j( R, }5 v8 e
PLA
3 w, `$ B7 L! f! q# d ] STA ADDR_DATA_TO h8 M. F) P6 G5 x5 W
PLA8 I) \: Q4 Y3 B8 J4 s B% \
TAY& l; r/ E) t" D8 A/ ?- o" z
PLA/ A) `; W/ |( ?" q2 D- D! X, m8 z% o
TAX
6 P3 f8 Z* Q6 K PLA
! Q# k/ u- J/ V. G& T PLP
8 i& j' o2 g. k o0 `: T " l! x2 U: D% c8 p, g2 Z
7 ?$ B; m% Q D
6 x7 Y2 \& E, R8 ~4 z% b- zDATA_COPY_RETURN:( N, N9 C% t$ ~: ]3 a4 V
RTS1 @5 d7 t6 e, ~+ U' [8 S, i
3 f1 F8 D7 ^: A* W& M .ORG $C056 ;精灵指令覆盖" o6 u, H1 Q3 c3 G. m S
JSR $FFB5
9 X- j+ f1 t: W7 }6 t6 @
1 q8 G Y# P( X4 E' V* K2 i .ORG $FFB5 ;1 A2 ^) K. D8 O( _; [1 ]
PHA
6 X- t4 P( ?7 @- \ TXA
4 c# j Y P/ |% `& R PHA
3 j0 ~; B4 e* @$ j1 ^/ B) v7 {% y TYA3 p1 ^3 Y6 t! `' I
PHA
# X- m7 n; M& g2 \+ d LDA $71FF ;比较7000-71FE数据是否完成复制4 C% i: d7 P$ t7 H% h C1 W+ b N/ _
CMP #$FE" E/ | P) _" e
BNE ADDR_FFCA
_/ R1 j$ ?! u PLA2 m ^( a/ ^2 b. |- r/ P
TAY
3 B; D) y# J) R. \8 a PLA
7 d# ~, F, V# w v TAX
" r! t" Q) c/ n PLA2 X$ k. V5 l! l/ n5 i. s
JSR $7000 ;跳转到自写程序
/ L; e/ j$ m9 K5 G RTS& P2 @: g* c9 j0 ~ V5 K
ADDR_FFCA:- o; t" }5 G0 g# k; T. r
PLA
) q; |- x t3 e TAY" E% Z. f @' v9 I- x( V: O
PLA
/ v8 t+ G S. h; M; D TAX
8 Q5 i! n% \& h PLA/ ^% ]; L5 S+ p# }8 }$ M( Y' r
RTS0 \) ~$ ?6 q: N6 @" z
: U0 D1 ]3 r; O" V D d
& y3 Z( v8 `' r* n( D8 t' K
: m2 b! x% r! q- N( Q. M" O7 ]
.ORG $C264 ;自定义的MAPPER2切页程序: W& d3 \" Z7 {) B. {; a
PHA4 y7 Y! }$ K9 S$ W- @( i
TXA
; N# [) V5 R/ ~' ^2 ?' M! V. q7 g PHA! H3 P* P) b9 V; c+ ?
LDA $0066& m6 X" Y- |2 ^& O1 r5 ^% J" n4 x
BNE ADDRC280
: d' v( a6 l) @. h% F LDA #$07, _. g4 }* a* @$ F% ^
LDX #$03
. S, J/ S0 @6 A2 b4 P6 g JSR $CD9B ;自带的切bank方法: j9 t" R6 Q; F; S! B0 g f4 p H
PLA( G& j7 P& Q' b0 D4 I& D5 H
TAX
+ d0 V7 o o- S i2 ] PLA \! z+ ?+ h+ {' I
JSR $8000
9 U/ W' ]1 f2 E& _ LDA #$06 y7 F) D+ e/ E; w) K
LDX #$03
! G5 q( O3 O+ s JSR $CD9B ;切回原该切得bank(可以不用)& p) l( \) b/ g, }7 k0 j; |
RTS
+ o9 Y1 d8 H3 M. m2 F- S+ e! wADDRC280:- x, ^) }* \! I {) ^
PLA
+ W2 F2 L& R6 u TAX
g4 K* L7 k9 g' E. O- { PLA+ m* d" H* {4 e5 n2 b
RTS
. E5 f5 M6 N, \ A# n 0 C: X+ X- b, u3 l2 k0 {+ w9 T, a
0 B+ [& i& }* `; W* R( x;[FC][最终任务PPU][END]+ V$ [7 z# g) s2 y; A/ M
.ORG $C056 ;跳转到PPU重写程序1 D# l# O! G* l
JSR $7000
! Y9 e4 W: i. s( ]2 m# b H1 F+ Y/ P$ ~
.ORG $CEBF, S* j. w# b# ^& c* G
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
1 k. {5 J7 f; O* H) `+ {
; u" R P" W% N) { .ORG $E460* w+ a! X7 ~( r: k4 j
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入7 o! h: n" K$ Q: f3 U
3 h; F' v" k( r
.ORG $71F0' o3 E8 f0 h# w8 ~
STAGE_DATA_WRITE:2 _: o! D5 a% I0 S+ D4 [. o V7 \
LDA $6010" o% S& Z4 D, z! _4 X
STA $1E ;关卡写入% \3 Q! F# F) I7 o
LDA #$00
3 L+ L! _, {: t, z RTS
/ ]+ y# y& |7 G/ \2 c1 Q; \% ~" f/ @ .ORG $71C0
# K' P' H$ e8 \9 `3 oBULLET_DATA_WRITE: ;副武器数据写入
3 }7 W( {# X; T9 u5 U CPX #$0E
4 r' h, H! ]+ e% l( C; E7 G BCS P2_BUL" d( e r+ U. v! y
P1_BUL:9 ^/ d) [% k% l+ x/ m
LDA $6004: T8 X& b& I- v- ^/ k3 A' t
JSR $D7D0 ;P1副武器数据写入
4 a! ^2 Z; m" O! F' v. t/ m0 I+ j8 R, _7 \ RTS" }' l j! ^' a) H! P9 }7 {
P2_BUL:6 G+ A0 h; @5 r
LDA $6005
8 U1 ?4 F5 I/ [1 o. A3 x, w JSR $D7D0 ;P2副武器数据写入3 s2 d! M6 U- T; }8 v
RTS
' @- a/ J+ e5 u. B8 M; z1 h- ~6 X7 h4 t3 e
# c0 Y# G; e! `! | .ORG $7000
8 y1 @/ i3 a: ?# |5 f 8 j f% ~( C# n2 X( t3 _( u
STY $4014 ;补上覆盖的精灵写入指令
1 v% V- L" N/ V) L4 J PHA
; y& X ?- Y5 j6 i TXA7 b! C9 c. b8 y
PHA) |* m- s6 `8 D
TYA0 N9 N+ Z2 Z) f @5 a/ R- ^
PHA4 P2 u, e3 n O; t, ~4 M# z
LDA $0C, g% i6 t# K- U( E7 T* Z, ?
CMP #$01 ;比较是否为标题画面+ H: t Y8 }+ B( E: ~& `( i
BEQ PPU_STAGE
4 }+ A3 ?0 L( p) d+ I PLA* h+ X* j! |8 h9 Z, ]+ W
TAY
4 S Q5 k0 [1 b# v0 f6 Y* w/ }, v PLA
( k8 v9 [2 [7 q7 L9 L- z9 y TAX2 R( }& F- P% L
PLA" A& y8 { N1 k) V# n- p9 Z" B
RTS2 }( {5 _2 q; o4 \3 @
PPU_STAGE: ;STAGE显示程序
, \3 q$ F4 R5 | }6 \" Y A2 W LDA PPU_ADDR_DATA
4 N6 k# c0 @. {" g, q& p STA $2006
! \6 q$ n/ D* A, Y; b LDA PPU_ADDR_DATA+1
# y3 T f3 ~" q* J' m5 C STA $2006 ;坐标设置
8 n$ Z/ L# l) [# d, f7 r2 M LDX #$00
" _+ R) |' v: T1 S, x' _# KPPU_STAGE_WROTE: ;写入STAGE字模
9 l" t# _, ?" |8 B' [# J; y LDA STAGE_DATA,X
$ I- T1 P6 }8 A1 ? STA $2007: J9 k' z {/ p
INX
4 A( r- Q2 l% S7 ~: Y+ @1 k: Z0 f9 @- Q CPX #$06
1 `/ I3 w- L2 ~) k BCC PPU_STAGE_WROTE
4 L' A Q3 d" k: m LDA $6010& Z' _8 ]6 O' `! Y! z
CMP #$FF ;关卡数据初始化条件判断
* U3 ^3 U$ c7 J# n' ?; J2 E. X BNE KEY_B) l5 J4 Y7 m4 W1 e
LDA #$00
}6 i' |* e- k2 y1 S3 m1 e STA $6010 ;关卡数据初始化& M8 p ~) C5 v9 g8 Q
KEY_B: ;关卡减少& C; e" Z; X- i
LDA $04
H% m6 F! p9 t k AND #$42 ;按键B或左减关5 |6 ^) T2 {5 Q+ J
BEQ KEY_A
! o# i! j1 }) o$ i LDA $6010' {8 B" P( v2 H4 H. V
CMP #$00 ;关卡比较, D- ]7 C6 h2 M( S
BEQ KEY_A# y$ P' C: E! A* {- _& ^2 w
DEC $6010 ;减关
9 _7 b/ N7 V0 L; |KEY_A: ;关卡增加
2 F v K3 t4 H, @* W LDA $04
" L, c/ }; B! E: H8 E: U' r AND #$81 ;按键A或右加关- d7 Y1 X; T- w
BEQ PPU_NUM_WRITE
( ~1 J! X! p2 [6 _9 c. J7 Z LDA $6010
' J* g: o2 J" y! ?8 ] CMP #$04 ;关卡比较
e8 g% r+ h4 ?. {# o7 M& n& G( P& b BEQ PPU_NUM_WRITE
- n* k" J2 Y5 v/ F( j1 [- \ INC $6010 ;加关
2 C2 q6 C( [$ U w* R4 W9 L/ yPPU_NUM_WRITE:" J6 O4 x9 l6 P6 t3 {" E, s
LDA $60104 A9 Y1 G4 d$ d, v9 `. a; H1 ^
TAX) y% N2 E' {6 x: W A% R8 w
LDA STAGE_NUM,X ;写入数字
" j! _' i+ v6 C8 }5 ?8 Q0 R STA $2007% w) j, e2 E( q, e3 n
PPU_RTS: K3 c/ X+ }8 s; N1 v! Y+ {4 P8 d* B
PLA" u& x% s5 P" Q% O9 k L/ ~1 j* g
TAY
) m7 |) M Y8 r- Q6 Y7 p) _6 X PLA
3 o; e. x) W) D; |' ]' c TAX
! Q" \; B/ h5 G PLA& y8 i! i$ d7 \6 s
RTS
; v' c$ y- U4 h" P1 v+ q5 S 0 }: R' D3 W) {& S+ Z
# a) m) ~' |: t+ N' R$ l4 {STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据2 f% U$ `: m) p! M$ J6 i
.BYTE $EC,$ED,$DA,$E0,$DE,00
* K: s& s% `/ b9 i, ^/ n" DSTAGE_NUM: ;关卡数字1,2,3,4,5字模数据+ |! v, u. [/ c0 ]
.BYTE $D1,$D2,$D3,$D4,$D5
( e- o0 Y7 x# @' _) m( d- [ - U1 o% U0 ~( h8 U6 f
PPU_ADDR_DATA:
% d" e7 H4 z- s! s+ W" J .BYTE $23,$0C. Q7 p+ ^. Q7 A3 t, ?2 [! ~
* ~# r; q# y/ ]5 [6 f5 c; Y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|