|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
2 T" F' ^, ^9 Z& ?7 q4 M. d M' g l0 n. n. k$ B" p
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.6 i6 W3 t- [2 x$ l* b5 L4 [
然而,今天想到一个思路.
/ v% ^8 s3 D( T3 P# {# C' n0 P; q1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.: ]* Y* m: z5 l% p6 x
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
5 ^0 d6 y5 J, b$ T+ m( K" ]! z) ~3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
" [4 c" I. ~* h8 v0 o" v
+ G& V0 M- g( h4 I1 Y" S/ F
. q1 d9 q% I3 |0 Z" d0 B2 R& W;[FC][最终任务KEY][END]# d; H8 `8 l/ P t, X
button = $04 ;单次按键
4 V- P X& j4 `) N3 M0 T z Y) Lflag = $6000 ;功能开关标志
; ~# k$ F' Q" w9 Upause = $000E ;暂停地址3 ]" L& J! h" \7 v$ g2 |# Y: `
9 P+ I7 y7 [# D; p
.ORG $8000% @4 I. ]7 o$ l
LDY #$08 ;自带的按键程序
% \& [9 x- [& d1 p0 }ADDR8002:
9 ?, X9 I# L4 W& |# L0 N, t' N LDA $4016,X7 s# ]4 d: g' ^: [" P
LSR' p3 g/ z6 Y# B' N; }
ROL $0021
9 x' E# X! n$ ?) H; y& ]" `$ v LSR i& g. \5 y' g
ROL $0029/ ]2 J- |. m4 m9 {4 I$ x* H( w( ]
DEY
8 Q: d' F& O) M3 f& t# W BNE $8002
, k! f& p* r0 l% S& z* n% I LDA $00210 g+ E1 @5 |6 J8 L
ORA $0029
5 l7 i6 X& I8 W2 \) e$ E STA $0021
1 K1 |* D6 E ~' j# E% ^( H LDA $0020
! O) @2 E3 u7 I9 }" c4 ~6 N AND $00215 j- a8 H8 c& P( | g, L
STA $0020
7 Q$ w' \- k8 {4 V' P LDA $06,X" ]' M% D1 w: P
EOR $00202 [( h5 {! X; P
AND $0020# d3 [' n: C' s) o9 ^# F5 _- B
STA $04,X( H# J4 t. z7 R
LDA $0020
, e# ~% V; z, u, |- f3 y+ U STA $06,X
* ]1 i6 L# `; F m+ J" D) { JSR KEY_OPERATE
( ?3 e5 x, Q& J3 ^9 A) e% m0 p JSR Function ;功能调用1 K$ [9 f0 q. A* y
JSR Weapon ;武器切换调用
" Z$ M$ u& ~ r# ^; G# Z JSR Power ;威力调用
0 Y5 R( N" t( Y7 W JSR BULLET_NUM ;子弹数目 E# J, _! H% O
JSR BULLET ;副武器类型% s- f/ P0 g' g1 n' V
RTS
0 E. l" ~0 V( P
' w7 i7 I% I) n/ F
: A; H1 B6 j# J, h8 F @9 K) G* d3 H
.ORG $8050
2 r) Q- s: l" \$ r( WFunction: ;功能
/ U4 p0 \5 H. q7 c2 KWUDI: ;无敌
J8 Z+ U& m6 `( |- n9 ^ LDA $6000,X6 @; Y" i# f6 {# J
AND #$08 ;开关判断/ H* I9 @& ^4 x) I1 m& E% ^
BEQ LIFE6 |8 [! r7 c& j2 A! {( V
LDA #$05" [: t) P/ Y: J! H6 U2 U; W
STA $05DC,X ;无敌锁定# }0 T+ f4 ~# E. e# F9 q; b
LIFE: ;生命- r2 e$ |# M% E$ {4 ]
LDA $6000,X
$ G4 w- y2 V; N' t) c AND #$04 ;开关判断
, C! Q8 N! F: B7 h BEQ FUNRTS
5 {( j" q0 S/ K, J LDA #$05
5 o- j* P5 C6 k1 M: y7 f- d& C. e+ z( Q STA $1C,X ;生命赋值. {' z# n& ~6 r$ |
FUNRTS:" y$ q/ K2 d7 s/ Y# `$ ]4 N
RTS6 c8 I8 n7 {8 l/ H6 `+ A
0 i" o$ P9 O+ k
Weapon: ;武器切换
3 C% F# C0 n, {. | LDA pause ;暂停状态判断) D- N2 p% y& u }
BNE WEARTS
" N- l7 e8 j) A+ @/ A3 t2 @ LDA $04,X$ C; R4 `; J' t5 [
CMP #$20 ;选择键判断* r) W4 ]2 K j. i$ n
BNE WEARTS
/ ?4 Q7 T) r! S LDA $12,X+ z2 _5 Q; C$ g0 D$ k
CMP #$03 ;武器值判断* m3 J1 ?' y* C" I v/ r/ T/ I
BCC WEAINC! ?# z/ L, y5 R7 w' H
LDA #$FF
( T3 A2 G2 o y6 I+ P0 H" k STA $12,X ;武器重置0 |' E( Q' G5 | h* J+ E; Z
WEAINC:$ j/ \( Q- f* Y; D3 Y/ \5 E c9 p7 U# n
INC $12,X ;武器增加! z) A2 _( p# \7 Q Y1 i
: m1 I) }7 o0 z H6 H' k
WEARTS:, i- K) k7 z: T- Y) }. P" g
RTS
5 E0 @$ A( q3 c( q 9 i0 w9 f9 k, L
Power: ;威力8 K1 O* H: t1 O" m! L# ` N
LDA pause ;暂停状态判断8 A+ ~8 W0 q7 X7 k- C8 `
BEQ SPERTS
' {% x2 F1 j c5 WBUT_LEFT:
( ^. u# x$ B/ f+ n6 s LDA $04,X( h( }+ r! Q' W* t
CMP #$02 ;左按键判断
) T+ C6 l& t2 r3 s BNE BUT_RIGHT) m2 n4 g, o# g6 I: j; N
LDA $88,X; G6 ~, o/ C% L! ~$ ~* x: e. M& h
CMP #$00 ;威力判断
# c1 x$ `- B. | g' _ BEQ SPERTS: W$ C A- t; [
SPEDEC) s+ R; j% \# F( t. p& N
LDA $88,X ;读取武器值
0 [5 [; l, T9 k- C { SEC3 ~, {' [" `( _, o/ t
SBC #$080 }3 q) k `0 K# A; C
STA $88,X ;威力减小" }2 O2 X0 s! q$ g" N/ O9 q+ Z
BUT_RIGHT:0 q" c! W' x1 w# u# u% l
LDA $04,X
) F" F. \4 _3 I% |) L' ^. _ CMP #$01 ;右按键判断
! l+ Y1 Z& K8 G' |8 N BNE SPERTS! F( V3 D& @ e: Y
LDA $88,X
4 l8 B. |! t" W0 j CMP #$10 ;威力判断. F" v3 N) y0 M/ w
BEQ SPERTS
- Z2 ]/ H) q& d6 S1 E! CSPEINC:
! N3 l+ V* l6 F' X) R LDA $88,X ;读取武器值) A2 ?6 K& o. T R& [
CLC
! w; ?1 L4 s( Q- h4 u; q. R ADC #$08
. Q7 ]8 G. w2 \' Y! |8 t STA $88,X ;威力增大+ l! s5 o5 n. k! h
" h. Y. M! m- v. }; n
SPERTS:! x2 P Y# f E% }- h
RTS
# X; }+ N/ x6 a& F7 A P$ O# e% l1 p5 X6 \' N0 ~0 J
BULLET_NUM: ;子弹数目1 U1 u- P% z& q/ w j* X4 B
LDA pause ;暂停状态判断
' V! z( r4 C8 x1 m: I. ? W% H BEQ BULRTS
9 Y% K5 p' {1 t* D CPX #$00 ;主机玩家判断, E2 t3 `4 x! Z; j. n% ]2 p
BNE BULRTS
, h! [3 G$ n! D+ w: ~# K5 g LDA $04,X ;主机玩家判断
/ V; P! q, n" X& N6 | AND #$80 ;按键A比较$ _3 V; B; I6 C9 S. K# m" a
BEQ BULRTS
. k- V. ]; b' ?" D% ?: A( w LDA $87 ;状态判断
$ v p- D5 D/ O4 f0 z! O9 { BEQ BUL_2
: S: i6 _- }* O* |/ IBUL_1:+ o0 k- S8 I! I& C- u/ I( h
LDA #$00: R* I5 v7 k6 {: w1 x" s
STA $87 ;1发子弹
" n9 n" W& ]& _ e4 {8 q5 n BEQ BULRTS
- l3 z6 ]4 ~6 F- X7 W7 j* aBUL_2:) t+ _5 _7 X/ a8 V( P2 ~
LDA #$01% s, \8 {+ f: V1 u7 d
STA $87 ;2发子弹
" C; K3 R) z1 T. P2 s
8 P( \ u2 N7 j5 `0 gBULRTS:
5 ]- @, K- k5 O8 Y/ F, R9 ~ RTS
6 } C! d% M5 f) f9 G+ |& ? 0 T- z+ b6 p, ?: W2 i1 p2 [# _! P
5 {+ U! Z/ Y- N& ?, D+ jBULLET:, q/ t, B# o: a
LDA pause ;判断暂停状态
& q$ Y0 Y, E4 S: \% g* S: C0 ? BEQ BULLETRTS( w. N$ t, ^. O, ~; L) @' r1 B2 \
LDA $04,X
1 y+ F' C0 |3 n/ T) K CMP #$40 ;按键B比较3 X- v6 p9 S* }
BNE BULLETRTS
2 N. N* B; R% k LDA $6002,X ;读取副武器9 ~. T0 Y1 I& u6 e
CMP #$03
7 I* h- n m+ t+ u9 ^ BCC BULLETADD
- H5 @8 T. N4 I# b8 N5 V LDA #$FF5 y' c! I2 V7 T y0 ^
STA $6002,X
8 R/ o6 d7 a0 l+ UBULLETADD:
: O' \" g; y: W- U. P5 | INC $6002,X" ]0 [; N% Y; Z5 j
& J4 F3 g& G3 G# MBULLETRTS:8 T% r _- c1 r
LDA $6002,X
& e' g6 C! r% ~ TAY2 p H) }$ d/ \7 e
LDA BULLET_DATA,Y
/ O; U7 p$ E: ]2 _( Y4 L Z0 A STA $6004,X ;写入副武器数据
; n9 |' w* ]7 l9 g* `4 t( x' q% q( y RTS
. g1 X% l* A, z! {7 {, k7 R 1 z& _. \# }* _2 V1 G# M0 c3 O) C
$ V3 V1 n# e7 S! }5 G/ i3 K
BULLET_DATA:5 _- w0 `5 M/ j5 Z+ {; Y
.BYTE $06,$02,$03,$04
, A6 L4 L S% j( ~; X) {
( e7 V5 ^5 C9 a) \# r2 c
( K" J" s- Q7 B: w 4 y+ }" `- z( o# p5 p( V' k
KEY_OPERATE: ;按键开关操作1 `" x4 k. I4 S5 B" P
data_protect: ;数据保护
' V5 j* K" l! D- E8 P; H% J/ x3 p PHA
2 Y; [4 }& D" U. s TXA
3 I! \0 C$ L4 S6 N0 S+ ` PHA0 o* o: U" T p! i- d1 W# ]
TYA
4 C$ J ^8 S# n- h* G( @ PHA
. q" v: D4 h$ g2 M' i) F* A& N/ {! H3 i1 \) V5 a8 n+ l3 t" ]; F
FLAG_INI: ;开关标志初始化4 i2 B- j5 r$ V) v' m) ^* m
6 A! L$ j1 h0 A2 \0 Z w( m2 e9 i LDA $600F
% e5 w/ }" X( [% F2 W CMP #$01
) p! _9 R5 F" |2 L" C4 M2 t BEQ pause_cmp/ d1 G, M6 U1 }: ^% H
LDA #$00
9 r" z) ]( _2 h+ Z( p, _ STA $6000
" w8 a; I" N v+ p/ z STA $60015 H* o4 L. t! @. G3 B6 K
STA $6002
* V* o3 b0 l7 e' W+ G2 D STA $6003
: Y5 v' p6 R* x/ | STA $60047 p D6 m# x! F" V; y- K% k
STA $6005& x# e2 C& d+ [/ n; }( Y
LDA #$01: V+ Y3 o* f( X+ W! ^; o' _8 b: S$ r
STA $600F; D- N/ c/ n( q6 K
+ I0 P' W) Z4 g
pause_cmp: ;判断暂停状态
6 q- G7 M; k% N5 F, P# W& V3 ~% p LDA pause
7 O: n' e5 O: p4 I4 c CMP #$01 ;判断暂停状态
$ h8 n! d4 m) ?- x3 H, C- I# ^9 s0 m BEQ button_press' @+ y$ H( n' W3 O9 T. S1 T
PLA
' G% Q, B% D/ p+ d/ U4 B8 |+ J TAY
* a" \5 f& w8 m PLA
- h8 ~6 t9 j! A. B* Y9 ? TAX" M' j6 i7 t6 ?6 g' D
PLA
% e+ o: w( h3 a+ O( u7 O RTS
0 S: K7 C* ]; w5 c
: r0 k5 e' |8 A* a9 v6 Rbutton_press: ;按压操作
9 o# Q$ l+ s+ C$ u/ mini_Y:' D2 Y* Y( s6 K+ Y' L& L0 S
LDY #$00% {3 s2 z7 V. P$ s$ D% \
button_cmp:
9 l: M K( M- ?: ^, U LDA button,X3 u4 m8 Z4 d3 L! }
CMP ora_data,Y8 z& f$ [" Z" o
BNE count_Y_cmp+ j- I M1 V, m0 g1 ?" Z
flag_cmp:7 i% J' B ~$ H# l
LDA flag,X6 P) i' R3 `& y" d" n$ D
AND ora_data,Y7 i: a% K8 w- d9 A% \0 ?" Y% Y
BNE flag_and( c9 i# c7 G$ O: d
flag_ora:9 ^0 k- ?1 d: [% N# R+ h( R
LDA flag,X. g6 L8 M: X6 f8 c4 g+ T- b/ ~
ORA ora_data,Y
/ ^/ ~% _' ^& O4 ^5 u7 T% N STA flag,X
- l! v& X/ j' c: V+ _& _, ~1 T BNE count_Y_cmp
9 ?6 e8 R Q6 {; s: f; Qflag_and:4 T: C+ W/ H; ?1 U& Y4 b' @
LDA flag,X( N- B# \& w% e8 m; B) O
AND and_data,Y
, j, [/ n2 L6 _+ X7 ~% K; Y4 G STA flag,X
! r% o/ w- s) lcount_Y_cmp:0 U1 H. F0 O! i- q: B p
INY
) l1 C8 m2 C/ @4 W, C) Q CPY #$08
* ^- A @/ i: K+ [ BCC button_cmp
+ }. B" l7 L2 h0 E0 y+ C 0 N9 j! E4 Q9 }% ~
data_extract: ;数据恢复8 f5 B4 P* v, r0 g K
PLA
: J5 \& U: ]+ C; I, ?$ ] TAY n$ Z4 ?* k1 l$ k1 P7 j- `4 Q
PLA9 d; M7 c/ W8 I: |
TAX
/ R# `7 \7 Q5 h. d" M PLA; l* X% }# {$ X" R" o
5 m- |8 j" ~7 K% j8 [) C
return:6 l r/ p/ u0 m. Q
RTS
" H5 N# W; S8 P' B: @: P3 b" r9 c % [1 O! O9 m d* E, G/ \
ora_data: ;按键相或数据. O( W) B9 @# d% ~
.BYTE $08,$04,$02,$01,$80,$40,$20,$10# U/ u- e; \9 E9 P
and_data: ;按键相与数据
6 N3 R' d7 S1 C$ W1 z4 Z( p .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF" A0 C) N6 I+ {' c
% e( M: A- @1 [
/ `+ B! Q2 n0 b3 Q& B. Q; V9 X7 a $ P3 K% K, Q* Z/ z
;FC数据搬移程序 BY FlameCyclone
3 J/ j3 z. _5 S& j$ \ .ORG $8200
& d; e0 y5 b% X; { JMP DATA_COPY_PROTECT( x- U# P% k" A; _$ M
3 g7 ^, @% Q. H7 A/ r; S0 E2 YADDR_DATA_TO = $40 ;目的地址
0 x# Z) K; c5 Q# j, SADDR_FROM_START = $42 ;源开始地址
2 z' p, a- c2 S2 S S' `ADDR_FROM_END = $44 ;源结束地址- }% ]7 G& A; N( o, c
1 i8 t' a8 k" z' z5 aADDR_TO: ;目的地址. Q& n6 E$ u) a6 I
.BYTE $00,$70
1 w6 [1 V/ x) c' tADDR_BEGIN: ;源开始地址
3 R* K; p7 r4 H& O) X: n .BYTE $00,$83
, l( _. {; `- }+ K" B6 f# XADDR_END: ;源结束地址& L; J) A) f, ~
.BYTE $FE,$842 j8 c- e/ T) F) S4 _
, m5 ]( T8 R. U" G2 T
INT_ADDR = $08 ;中断地址
: P% _$ w6 g5 U- f) X9 c' l8 uFLAG_OVER = $71FF ;完成标志
5 I. y" F2 h E. A6 E6 g/ V7 G2 u; z( w6 N8 e& I
4 l' P7 S4 I. Z/ M+ \. k" aDATA_COPY_PROTECT: ;保护数据
' m) C, ~: o ^+ R. ]# l8 \" C0 z PHP
' ? ?2 k# }* v$ a4 p PHA
7 U9 S4 a7 Y( b0 _9 z' |' d TXA
' U& p( x- g* A2 ^" _1 a PHA
/ n/ l) X6 s! r- ` TYA' [0 O) V7 E3 P4 L* ^
PHA
. s+ T. W4 b1 w) d: k& ~ LDA ADDR_DATA_TO# T( J& Z/ ], Q+ J5 K% T
PHA
8 _/ S" o# K+ S! E LDA ADDR_DATA_TO+1
$ v8 ?7 g! G$ V- C PHA
/ ^" l3 x( U, c1 A! f( P1 V4 H& j LDA ADDR_FROM_START/ V/ Z# `+ @4 Q0 p# v0 V
PHA
3 D/ w8 y. C4 h5 B+ {3 X LDA ADDR_FROM_START+1$ i1 e2 h8 T+ K" t
PHA: s5 z# E& G6 ?* I4 h }- a) A
LDA ADDR_FROM_END
4 k$ D7 L5 ]8 ^- R6 r, _+ \9 K1 `) \ PHA) M( u0 q7 }) A( D
LDA ADDR_FROM_END+1' u# I; }8 f# l0 Q" m8 ?5 w
PHA
+ o7 I# k0 k4 a0 W% K% I: w [/ l5 }1 l
; O2 C. w+ G" I5 E* POFF_INT: ;屏蔽中断5 `) r; P/ J/ H
LDA INT_ADDR
$ R2 _" Y9 W! l AND #$7F4 N' V* w' U1 N4 T+ R; o4 {( q5 O
STA $2000 ;屏蔽中断& L" E# I, a4 C2 S( F
% ^& i3 a& [/ ~
( q B2 Z0 v& d( T, y5 L7 e: E
SET_DATA_ADDR_START: ;设置复制起始地址
( d! o, L g, ~0 ?" Y* I$ q! ]# x LDA ADDR_BEGIN+ {* t: A" V4 K' h
STA ADDR_FROM_START ;设置复制起始地址低位2 R0 M7 z* ]' e0 I2 V" D
LDA ADDR_BEGIN+1$ |! Z9 N, C1 ? ^' ~
STA ADDR_FROM_START+1 ;设置复制起始地址高位
, c) \; H; { C J7 h( L
, J( X% u- o# A! X4 BSET_DATA_ADDR_END: ;设置复制结束地址
5 v! U$ i; V$ T" h& L' Y" W LDA ADDR_END
+ v+ y6 N! E1 u/ ]5 D STA ADDR_FROM_END ;设置复制结束地址低位) w' l' h i9 f) p1 \( m
LDA ADDR_END+1
9 Y# g/ B7 H: @7 h2 t STA ADDR_FROM_END+1 ;设置复制结束地址高位# D7 b# M2 {! s' Y. w" p0 f
# w5 U) S: I& I& |SET_DATA_COPY_START: ;设置目的起始地址
$ s/ X# ~' f- Q* v* i LDA ADDR_TO
5 F5 s2 m8 d# Z9 ` STA ADDR_DATA_TO ;设置目的起始地址低位: i- o* `/ {5 Q, [0 U
LDA ADDR_TO+1
8 z/ O6 G6 Y2 K( U' j$ w STA ADDR_DATA_TO+1 ;设置目的起始地址高位
) S0 a, h7 Q* s. Z% V6 ]% p$ N/ u 1 ]( u7 r; D+ X
OVER_COPY_CMP: ;复制完成比较
' F# P+ A& z) g6 W; O- j( @ LDA FLAG_OVER: v7 L B1 A$ v1 [, @. U/ q" J0 r
CMP #$FE ;复制完成标志比较
1 L H, L$ J( \% W8 E' G. y BEQ DATA_COPY_EXACT
5 o0 a) q0 \ q% W0 y+ ~4 d; y1 r* O! k1 T* G' h
INI_XY_COUNT: ;计数器初始化4 S! n% z; e+ |1 _. L G
LDX #$00
* D- I' H% O: u+ u4 A/ F" l LDY #$00
8 n% u5 G) Y% j! T; p: @% `
W" ~0 ]$ I- wCOPY_OVER_CMP: ;地址比较6 Z8 G p* }+ K2 R* _. P8 M. i) x
LDA ADDR_FROM_START
( o1 f4 c k M CMP ADDR_FROM_END
$ c3 H, v+ R$ h+ T' K BNE COPY_START
1 r7 Z3 s; C! Q7 `) n LDA ADDR_FROM_START+1 w, V. |6 S5 e1 U- B
CMP ADDR_FROM_END+17 O0 X3 o; Y" k! }3 j) l
BEQ COPY_OVER
' ^( k# x: A/ M- P' F " r( X1 n1 m: j! y5 b8 W% J; Y8 Z
COPY_START: ;数据复制开始
; m, f0 e ^: [8 v( I9 v4 ~$ p LDA (ADDR_FROM_START),Y ;读取源地址! J- E5 L6 k3 B4 [
STA (ADDR_DATA_TO),Y ;写入目的地址
% f% w3 a. a, R% u4 G5 o INC ADDR_FROM_START ;源地址低位递增! i3 t4 B4 F/ L7 Z
INC ADDR_DATA_TO ;目的地址低位递增
: d2 Z3 B7 x5 H BNE COPY_JMP
8 a& z+ g8 W- e9 }0 f; k INC ADDR_FROM_START+1 ;源地址高位递增
; o) ]. t7 ?2 t5 Y+ M INC ADDR_DATA_TO+1 ;目的地址高位递增5 _0 C' [. k# b1 {2 K: v; H
1 [8 |& n9 ]4 N1 Z4 \2 d
COPY_JMP:
5 v7 O0 K/ D7 m, | JMP COPY_OVER_CMP
1 F7 ^& W; C% I: c0 N9 ]3 {! J
h! x9 L& p& b8 iCOPY_OVER: ;复制完成
+ l) F% K0 E- n8 j% Y+ n. o LDA #$FE+ O2 Q9 u- C* w6 d
STA FLAG_OVER ;写入完成标志5 }8 i! A+ l. Y1 _! P2 f! y% c: Z
FINAL_BYTE:! d4 n9 s& x6 @3 W5 G8 V5 X
LDA (ADDR_FROM_START),Y ;读取最后一个字节
+ L+ l: {1 q: x* z/ U& k$ _- x) s STA (ADDR_DATA_TO),Y ;写入最后一个字节# `# D: e% {3 E3 { ~
. x% I4 N. M* i8 f: E) y, O6 Z3 W
DATA_COPY_EXACT: ;恢复数据
# ]: z% e C' L! z& z LDA INT_ADDR- Z$ c; |: p1 d1 s
STA $2000 ;恢复中断
/ z. {; N9 }! }3 `7 f B4 G) p1 L PLA# t0 t1 p; _, p2 x3 l- D" ^2 }
STA ADDR_FROM_END+1/ z1 O: r. `, p+ U p
PLA
, Q) b$ ~+ Q8 I5 Q2 \ STA ADDR_FROM_END5 Z( e; @8 K/ t
PLA
; o- I, `! q6 ] STA ADDR_FROM_START+1; I; @0 R3 h' T. G# V+ O: p6 n
PLA3 \2 j) A( {$ S7 l I8 v6 I
STA ADDR_FROM_START5 u* N, x; X" i& `' N( p$ `& o
PLA5 i4 k# l2 @' L- C9 t3 h
STA ADDR_DATA_TO+1' i1 H. S2 s. q" n+ Z
PLA2 A& S5 b* d8 i. H" N5 H8 o
STA ADDR_DATA_TO$ C& f6 w; J4 t; c0 z9 ^/ j+ v( @0 ]
PLA3 J8 C' a" Z8 X0 q
TAY
; e3 r6 ^: m4 O4 J( }+ y6 l+ _ PLA
6 I% M4 j) d# w" ?+ M$ i TAX
) q+ ~4 \3 \# s PLA+ m+ F# m' `, j+ J: S! J& I: |. a
PLP. }9 L4 A! P# Y, B* |( ?5 N
: d! g& }9 _" X* f# l! s9 r: F
4 w# Q* ^: ?3 S# c0 {! S
0 X5 X9 G8 e; gDATA_COPY_RETURN:
8 g0 G" V1 T' T6 R+ W RTS
4 O& E0 b7 ?* X- ^0 z7 { $ [. ~; v; ^! [; W+ Y* P! }8 m
.ORG $C056 ;精灵指令覆盖( }0 b- X; y, a- d% \: }
JSR $FFB5
: Y7 d+ x* v- b6 m# p1 W 8 U0 {5 d4 W0 }
.ORG $FFB5 ;# l/ b+ Y4 o6 A K4 W
PHA
! H* r3 @9 Z5 t# t0 D V- I TXA1 S' s$ H }7 l7 L& Y& X% }7 j6 R
PHA
% P, ?2 m, r4 d0 C y TYA- ?% x: T. f& t* b* f& o
PHA
2 G8 \: K/ t6 ?7 B/ Z LDA $71FF ;比较7000-71FE数据是否完成复制$ p% I4 c6 g, D. e
CMP #$FE
) X8 k& l1 [! }$ ` BNE ADDR_FFCA# f# j( k4 q* T; K1 C
PLA
* e* G- e# @2 }6 }( G- f& G TAY
/ ~' f$ \. C7 v& b PLA
" |: g& w* d* B4 L* } TAX6 ?4 \* \9 s* o
PLA9 b) E7 M+ v$ Z' X' {& ]7 P
JSR $7000 ;跳转到自写程序
. `/ E! X+ M% F6 ~: h! o5 B5 J RTS
; A. G M- X( B$ L! r+ t+ g$ p0 PADDR_FFCA:' Q9 J0 L! l; r- b
PLA5 H3 I7 e1 g K
TAY
/ n' Y" ^. Z7 i; R PLA& Y: x1 n: ?$ u# z( J9 `
TAX) U: `3 R* d' @& W; s
PLA+ N' ~$ V& }5 D; f; o
RTS- W: g2 j' L9 N0 n$ c0 I
) ?5 H |! r; v, `. d) v( ?) N& z3 q; J E
1 J) h* H# |6 ^ .ORG $C264 ;自定义的MAPPER2切页程序
1 {* Q, S/ ~7 C# r1 t PHA
* d# z* u+ |% Y0 X! m6 g TXA! D, W5 h) z3 P3 V
PHA$ ~" d! H) V8 E* f
LDA $0066
5 c6 O8 G. ]9 m; M5 ? BNE ADDRC280
' _, z$ I+ x1 }4 }% V/ I LDA #$07
% J; M$ h/ D; q! @. V) o! }4 a/ X" A LDX #$031 J- s# Q+ `' Z5 i3 X2 y
JSR $CD9B ;自带的切bank方法
1 a T$ G9 n$ D' L PLA
; u$ c9 g8 m. G/ ?) }( c. Y TAX
+ [" [0 P5 m# t/ V PLA
+ M' n& S) ~2 |/ Z" s7 i: S2 J JSR $8000" f; O- }9 s" L7 _1 V6 [9 D
LDA #$06: r6 r: k! h! F& y3 ]5 E
LDX #$03
, X- M3 A' o& n JSR $CD9B ;切回原该切得bank(可以不用)+ I: ]+ O) w6 F, @% k3 V. R; W, Y
RTS8 |1 z! U0 y, f c
ADDRC280:
. M2 c2 [3 e! @5 ]7 ? PLA3 u2 }* G3 H S7 g: e; Y* Y
TAX* g( a! L9 s: Z* m( B% p
PLA& v: {6 l, ^: X3 T; U) D& J% _
RTS
N) H+ G, N- t' w
0 ?1 D& n/ X+ H: t$ Y. c
- `( Z- v: p( k;[FC][最终任务PPU][END]1 u3 ?* @3 J' }1 ~
.ORG $C056 ;跳转到PPU重写程序$ P9 w7 y$ {7 b2 O% m6 E
JSR $70007 l) b, x! C& P7 P4 @' `; D, [
8 R3 x" ?. d2 R6 ]
.ORG $CEBF! _3 c* U8 P) \( [, v8 d" \
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入6 a: Y$ X' f" q
) G1 e! _! f" {* e# h
.ORG $E460
% p- J& V( `) i) e' W' _+ g JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
8 ~& ] k3 T: d/ `
' x( a& ~$ U& E# c .ORG $71F02 g% p) f! L: K, L/ c1 A
STAGE_DATA_WRITE:
( @$ D' ]( |1 c% B$ m" \0 N LDA $6010
7 T: |9 N- A. g; d5 x1 r% U' ~ G STA $1E ;关卡写入
( K' f/ I' N- {# _# J5 L" }5 L- g LDA #$00
1 G* B, @ l" f$ m5 [ RTS, @6 Y2 t, U, Q2 M
.ORG $71C06 n, b# u4 f' d3 j$ D. P
BULLET_DATA_WRITE: ;副武器数据写入) k' V; ?- ~2 ` l5 t
CPX #$0E A4 p2 u7 ?$ X" ?2 z# p( L
BCS P2_BUL! }) W1 T8 p8 M, V4 M) v- a
P1_BUL:
* l( R. ?0 G. W LDA $60040 N$ ~5 O X: y2 k; h
JSR $D7D0 ;P1副武器数据写入
! I7 i) z' m0 [* P5 P J$ b RTS1 G1 ^* F/ H: M" q5 e4 N# x+ n
P2_BUL:; J& K+ N- ?# F/ O ~
LDA $6005
! G( x) Y; b% {4 @ JSR $D7D0 ;P2副武器数据写入( [$ {/ F: K8 p, ]+ q
RTS8 a; p. k$ y5 x+ `( K G) J, I7 y
! Q: b; {. O: p: m' R
: q7 Z z) y1 P% H
.ORG $7000
8 E7 c; ^; x" O _5 ? 9 {# o$ T1 {3 `- z' E* ~/ z
STY $4014 ;补上覆盖的精灵写入指令
- r3 _- g( F% C% ]. \* w+ ^1 b# x PHA: Q5 D1 P; l2 G) G/ d
TXA
8 U; Y+ n' h7 Z% l7 K! @ PHA
; B3 n% W% p5 B* Y% ^. b! H$ { TYA) @# {% L! e: t7 i7 Z7 n
PHA
6 w/ C8 f5 z+ [# x+ F LDA $0C& u4 _6 ]9 K* L3 R" g) r
CMP #$01 ;比较是否为标题画面
6 a8 Z& i9 B! F! p. A2 i( R: r# M; I, E6 @ BEQ PPU_STAGE
9 C' @& E9 c4 y, [ PLA/ r! q1 }* R' ?$ p* Y. Q
TAY
, T3 W6 s9 |/ e1 z/ }5 s! w2 C PLA
& y5 W& a( _/ f' J* U TAX& F5 r1 u+ `6 H2 O% S
PLA% L% ?$ D3 [1 \9 G- z" D1 p
RTS/ r" T6 V3 M: E, B
PPU_STAGE: ;STAGE显示程序
$ P2 ~; i4 c2 i" Q LDA PPU_ADDR_DATA
8 _/ p) p2 T" ?# h$ l, E STA $2006, W& ]6 c; s5 z% M
LDA PPU_ADDR_DATA+1
5 B: m9 d% `# J) S1 N STA $2006 ;坐标设置: q1 l4 j. q0 C. u6 B
LDX #$00
/ M. X, I5 A, ?8 R0 Y/ v0 p/ y, `PPU_STAGE_WROTE: ;写入STAGE字模
: p3 U! B* L, G- H' N LDA STAGE_DATA,X1 ^7 g \2 |; O# N: E/ h, v
STA $2007
5 E2 y' ?/ y- N/ g4 e7 W' E INX
3 I/ T. T6 o* @9 W0 Q( ?2 A CPX #$06
! G0 X4 E1 T4 @+ I9 \7 F BCC PPU_STAGE_WROTE; N2 B5 V6 ~" [& |
LDA $6010
4 ]( i% b+ I p. y1 K" R7 a CMP #$FF ;关卡数据初始化条件判断
: n* G2 b' J' x0 ?% o! ~4 l5 I/ n1 X BNE KEY_B j5 p) \1 D2 U4 O3 {! \# _
LDA #$00. p3 P% m! i" N6 }' ^" M
STA $6010 ;关卡数据初始化
! U' H* ?2 r; x2 {9 I( eKEY_B: ;关卡减少
, Z/ m% {+ ?0 J9 h& L LDA $04
0 d8 A: Q. q7 M" X& V" R AND #$42 ;按键B或左减关
8 Y; W/ u5 M* B# p6 o% T/ s BEQ KEY_A
5 n* r! W e" Z% F2 ` LDA $6010
2 L1 S# V2 h- q9 X: I1 C S2 l4 Q CMP #$00 ;关卡比较; [& K) d0 o* ]2 e% S
BEQ KEY_A" w* g8 q$ k6 q, \6 j9 e5 X1 r
DEC $6010 ;减关
d/ @2 }$ g' C. k0 VKEY_A: ;关卡增加
1 E* n$ E0 Q% `2 G$ G0 K; n) i) i LDA $04
6 k5 u! c' Q8 @+ k+ B" W9 K7 f1 O AND #$81 ;按键A或右加关8 b( E1 g! z- s) T4 e% e
BEQ PPU_NUM_WRITE4 f" Y' ~7 i6 N2 O8 _
LDA $6010 O* w2 V9 \+ h) N; C! D
CMP #$04 ;关卡比较) o0 F a/ T- }* p/ }) u
BEQ PPU_NUM_WRITE
0 m" S/ N1 H: b9 B" M# I4 T& {. m9 y INC $6010 ;加关
: V* ^- n6 ~1 \8 ^9 T# T( QPPU_NUM_WRITE:
% F: X2 e8 k+ t- N LDA $6010: r* J' \. ]% Q1 I9 h3 L7 u! X0 K
TAX! [/ k3 H, h% S5 R7 h( p
LDA STAGE_NUM,X ;写入数字
Y% K' g& D, Z- l/ p% T) L/ S STA $20077 @5 x [6 G' c5 \9 P: b) l6 e
PPU_RTS:
3 P0 u. l2 w* }/ T PLA* K; P% x7 l; U' H
TAY- s4 r8 `- {6 i" r
PLA- e4 Z% U: u$ P# ~' g ]9 d6 C! X
TAX
) l# U7 l6 X" O9 h/ T5 p: v( s PLA' }1 G6 J {, x9 g6 q
RTS4 n7 j) r6 \- u' r
W- ^8 c/ _4 s( ] 8 U% N; k! [$ d
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
8 ]' y- u0 i( \$ z0 P .BYTE $EC,$ED,$DA,$E0,$DE,00
, j, w6 Z3 L- @; fSTAGE_NUM: ;关卡数字1,2,3,4,5字模数据6 [* b4 k# p/ f3 Y
.BYTE $D1,$D2,$D3,$D4,$D5
6 b& }/ Y2 s) h+ { 4 Z9 E; q1 o8 j2 X$ P/ o( n
PPU_ADDR_DATA:
6 w0 A/ l) l3 ~# o$ M0 n .BYTE $23,$0C7 q% e) e$ y/ R/ S2 G$ T2 q: }
6 c* t" f* X7 f1 \# w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|