|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
- ?1 z1 y# H2 K; T x& a& O8 Y# o5 L+ g- a) V; f, K
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.0 X# B- X" J+ D! F$ ~
然而,今天想到一个思路.
( X/ J7 i) w; q1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.8 N/ j9 q3 j! o2 n
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
& p+ H. T9 G3 R9 G3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).8 u+ d5 E( K; o- u0 Y4 [- s6 @
/ V7 B( t* s, o- M
* P, s' k0 ]9 {/ h4 o& r" `;[FC][最终任务KEY][END]
& B, H( N. P* f4 f) B2 Dbutton = $04 ;单次按键
0 B Z8 D/ S. \& I* p$ Yflag = $6000 ;功能开关标志
; G. _' V; ]6 K8 b: f3 t; ]/ tpause = $000E ;暂停地址8 d% F6 c% e' X& ?1 E
" J+ l4 C9 P+ ]5 s8 [ .ORG $8000
9 W6 J: K) g# Y% T4 W LDY #$08 ;自带的按键程序
. v4 S6 D5 v5 PADDR8002:+ a2 I4 S+ m9 f3 b
LDA $4016,X
! P) U J4 P$ q0 d( v$ b3 @ LSR
" l3 J X1 S9 U# t8 i ROL $0021$ O+ i! {, b# ~8 \: @; v: \
LSR
4 J( l$ f4 R" }$ g4 j. U ROL $0029$ o4 w0 n' {, d
DEY4 n! F0 d6 g1 z. C: j9 H* }7 L
BNE $80026 M% ^! V) ?/ A; C
LDA $0021
% Q( W! d( @0 G" V) } ORA $00291 o& l8 U9 X( o8 N+ j# P
STA $00212 M. F3 F% m& \( g+ p1 @1 _
LDA $0020: f4 q3 ], C+ C9 J9 h
AND $0021- b5 ?9 `+ G+ S4 _$ j8 F2 G
STA $0020$ N0 a9 ?8 q/ I: F- j. @- |- x
LDA $06,X8 Q3 G+ U5 j1 T; r
EOR $0020
) V) T# l! `" j4 r! j) G5 F AND $0020
( |2 b q8 P# t6 o+ X3 D STA $04,X+ }; i' Q% m4 J9 X- f* e* t0 X
LDA $0020- x7 m: T, b |' E" Z
STA $06,X c U2 e9 F( S7 i- ^. j6 q0 B! T
JSR KEY_OPERATE. c+ C5 y, }6 }7 Y, o" ]$ l
JSR Function ;功能调用
: S* U; t6 a2 p JSR Weapon ;武器切换调用
+ f x% X1 p% _" D( p5 F JSR Power ;威力调用# l* N# D( N" u3 p1 p z
JSR BULLET_NUM ;子弹数目0 F) F/ p4 x1 H
JSR BULLET ;副武器类型
$ {5 }0 @$ g) F& V6 E$ Y RTS
( L& S3 K( l4 x% G" G
; A' g; S5 Y' H6 g, ^2 o2 G
6 s' y1 j. B, s2 D" s* Z: r9 F0 X+ u3 M( C& a
.ORG $8050
6 R) A- c. ~$ b" y- T3 G. zFunction: ;功能, s! f4 g0 K& P7 v2 a0 I
WUDI: ;无敌
( H2 M j& Q( f/ c3 D LDA $6000,X
& Q5 V$ Q. @3 ` AND #$08 ;开关判断8 l4 \# d2 \% H: b) J8 u9 r# R ~
BEQ LIFE7 w" L/ A0 p/ i0 r, k$ s" c
LDA #$05( Z4 x! z% X: _% w$ ~; S, q
STA $05DC,X ;无敌锁定 P# f6 u$ D, F F+ r
LIFE: ;生命
2 x# D) k5 b4 v9 ?+ V$ }' D+ k LDA $6000,X! ~$ l$ a8 r0 h( q
AND #$04 ;开关判断
8 t+ t( `$ i y' Z BEQ FUNRTS" k3 a8 I. [9 q+ W. l; T
LDA #$05" l7 ?0 \- C; ^" l+ m# z
STA $1C,X ;生命赋值
8 f0 L4 r' N6 d7 |- I8 F& j% ?FUNRTS: z4 B" p1 q$ w- ?0 I
RTS% ?; T! a; Z1 M$ ^- _+ C
/ j* ?3 M) ~- N" R% ]# U$ g
Weapon: ;武器切换
& R; U! N6 O7 i' `. e LDA pause ;暂停状态判断& J9 S) a$ J5 |8 l
BNE WEARTS
! o; D5 b( T4 s7 a LDA $04,X
" k& i. Y: X3 U& ]' R CMP #$20 ;选择键判断
2 j" t4 @! H' Y7 c2 T1 ~ BNE WEARTS
9 ], k" N- F9 Z9 x7 P& f. l LDA $12,X
# T1 o- _4 C/ L% i3 C$ z CMP #$03 ;武器值判断9 f0 L; p1 B7 J) R; b; M4 K( ^0 c
BCC WEAINC
( C# b8 J+ P, P+ E: F5 P' c. _' E LDA #$FF t* q$ q8 C6 A
STA $12,X ;武器重置' I+ R' M0 ~) u2 H; @; C; o1 g
WEAINC:
0 @2 T/ o) j9 n9 K1 a6 ] INC $12,X ;武器增加2 h) `3 V: _0 H7 E- L4 h
" c& K! R% `) o8 I' S" w! vWEARTS:/ t; H5 g! n/ S1 t/ ~8 z
RTS& i2 I+ ]9 }- Z3 s4 P! {
: j0 A, T) C) y( p! o/ Z9 Z% v g
Power: ;威力6 {1 @: C4 Y( I, U) |) f
LDA pause ;暂停状态判断0 t4 c6 t. F+ B( Q5 w! h" Z: a
BEQ SPERTS E, _7 _6 y0 i3 }& H
BUT_LEFT:5 V" T) ]/ M N8 ]
LDA $04,X
0 o8 N0 _: L! O( U CMP #$02 ;左按键判断( B6 m# E) r b0 V
BNE BUT_RIGHT
* W# S+ M" W6 p( z LDA $88,X
+ b0 |; S c+ x5 j CMP #$00 ;威力判断
6 c/ S* N6 `* t0 D BEQ SPERTS* k- v* W8 c# N# n! @( B8 q4 K. d
SPEDEC/ r3 D4 x' M( |) u* Y5 C
LDA $88,X ;读取武器值
. c) }3 R' S; p# F SEC
4 U' E" _ S( u. e d3 a# M SBC #$08* r& A* o! T2 H
STA $88,X ;威力减小% \1 `9 ]- U1 k P$ U, c
BUT_RIGHT:, Z" f* s0 p8 s* F
LDA $04,X: [7 c5 ?6 X9 T& \+ H5 H7 ?" V
CMP #$01 ;右按键判断0 _1 m6 Y+ s! q- q1 e
BNE SPERTS! m9 g% r5 {6 p6 k' g7 K7 i" ^! m$ R: v
LDA $88,X
. g8 [0 n: M6 E4 G I5 w CMP #$10 ;威力判断; S* L; U' g/ l4 Y" Z
BEQ SPERTS8 Y3 K) h, j( k
SPEINC:
3 h) M1 E2 q% k6 p5 A( _( v LDA $88,X ;读取武器值
$ f; i4 z& M4 |6 e3 [ CLC
! e2 Z& J6 ?9 @4 E$ ?, Z ADC #$08
; ^1 x- \% p9 p1 \ STA $88,X ;威力增大
" t- A6 ]6 `+ y2 t4 c: i4 O
' ]! Q+ Z0 q t: [5 |SPERTS:
) |) J8 Z- r# {+ P+ P5 i$ r RTS
1 k' ~5 M* D/ v8 Z. |. X" u% s
BULLET_NUM: ;子弹数目
% b1 s- W, R$ V$ R LDA pause ;暂停状态判断, j0 ^6 }8 Q* K5 y5 X
BEQ BULRTS9 q; w5 E6 z* L6 `. ?8 x
CPX #$00 ;主机玩家判断
% [; i* L0 u0 y e; O' H BNE BULRTS- [9 p3 |5 E3 L, V
LDA $04,X ;主机玩家判断2 j ~0 G/ ?9 a
AND #$80 ;按键A比较2 Y: z7 r( K' K7 j# m
BEQ BULRTS- B$ G* ?0 y! u# m3 I' t
LDA $87 ;状态判断2 Q) n+ k& D6 Z9 ?* w0 m b
BEQ BUL_26 d9 N6 ~0 h/ E# ]
BUL_1:' i4 A6 O$ P. n
LDA #$00% e+ H3 s. j' ^& T
STA $87 ;1发子弹
7 L/ B: S0 v. W BEQ BULRTS5 h0 g& {3 [* Z* r
BUL_2:8 |: j3 u, H, Z7 t: N* ~
LDA #$01+ \5 `9 @9 U9 | ?5 b
STA $87 ;2发子弹, P2 n9 h9 b/ J( J9 _# d1 g+ w
: r% V. K/ B, N' X: c- GBULRTS:
4 O, H" [9 i1 ? RTS
) y7 r# r6 Z$ j8 i
0 I" |. a, q: A5 j( [: }4 C# G q4 y+ _0 P5 B& [6 l4 S9 ]
BULLET:7 O, s8 T5 K0 [5 P+ m |; M. n
LDA pause ;判断暂停状态
3 t5 ]: Q. g% Q6 n BEQ BULLETRTS
$ `0 O* n& k1 ~ LDA $04,X
% N7 M0 K( r" f# ?! _ CMP #$40 ;按键B比较
1 \) F5 _6 ^' X1 C3 X8 e: Q BNE BULLETRTS
9 o w5 ~* u! D- c) u LDA $6002,X ;读取副武器
2 [' y8 {& t, e! ^+ q CMP #$03
( v* o# K1 _$ R) h- T8 r BCC BULLETADD
2 F( G9 Q4 i) Y8 e7 Y LDA #$FF
7 o2 E, r! @/ e1 h STA $6002,X+ M, z6 M3 w8 J+ r
BULLETADD:
! k5 I4 Y2 W f, b INC $6002,X
- e9 x6 E% B( V8 _ 6 V6 R: Q" p- x" g' z9 H3 A) D7 i: t# x
BULLETRTS:* y7 Y( u$ i2 o& L$ k, d5 X
LDA $6002,X' q) e' P. n( s3 f% z
TAY
& K/ }9 j' o; T) u) [ [4 n6 u0 \6 Y* X Y LDA BULLET_DATA,Y1 `9 n, U! N* u, @! V
STA $6004,X ;写入副武器数据
5 I2 W2 v' h8 j* b4 M RTS+ I' Q4 p9 [1 K" `
) S5 h/ r4 O( d' l$ K( h
6 z8 W2 z l, n% d* Y) T+ X# |" h
BULLET_DATA:
+ m* C" X3 y! s/ d1 j' e; Z# s .BYTE $06,$02,$03,$042 t. P# q2 I, H6 i7 t
+ {( m6 k5 u6 n& E. D
; n/ v( m7 I9 V
/ C/ Y+ B8 ^; sKEY_OPERATE: ;按键开关操作5 [9 u* G, u) X" k$ p4 s/ \+ u7 x
data_protect: ;数据保护9 Q* h T7 R3 c* n
PHA6 z0 I5 q* \( F2 ~7 _$ w/ U
TXA! ^" C4 a! M G& b( D6 Y
PHA% o( j" Q/ z+ _& L3 z% a
TYA
" k) |/ |; @* L3 f PHA5 y! | F: Y' c, D# c4 I/ @; M
% i7 P# r2 p( i, _8 L- v: w* j; z# N5 M+ ?
FLAG_INI: ;开关标志初始化5 i/ `" z2 n C3 w9 ?
! f2 ^6 _7 G A2 n' W& I
LDA $600F% |: g! r7 k" t( _
CMP #$01# w+ r( U& }- |5 W: I- l+ v( B
BEQ pause_cmp4 W0 F R; q, b6 C8 I
LDA #$001 C: r" G {8 \& U- @6 T7 U
STA $6000
5 v6 |. e r* {0 R+ D) a1 a STA $6001
8 m8 J& M2 j: n8 {, H) `$ K6 ? X STA $60022 x {% m, n( a- Q6 q- x
STA $6003
" c* z D3 V/ X0 `# v% d. D STA $6004
0 V6 M* G! U5 E4 | STA $6005
+ [" Q! X9 ^, m V LDA #$01. F/ v7 N/ P- _+ A7 Z. E
STA $600F
1 m& o2 ]" T2 h
7 h0 S7 k7 |7 y1 H6 f5 spause_cmp: ;判断暂停状态
, V/ P0 a* B# f3 q5 O, H1 t' \: S LDA pause' R4 j1 g9 m- `9 a+ [( I
CMP #$01 ;判断暂停状态3 z* `$ B/ f4 P ] i3 [
BEQ button_press7 K" U \; B' q4 G: y
PLA% M6 ]. z* l; d: j% Q& k
TAY
) A/ S' m0 t( L4 _ PLA. E6 m* w8 B# E$ G: i
TAX3 Q9 a3 G( j/ O! J+ Z! g
PLA
4 O& @, O4 c! Y" W$ v RTS# X1 V" a2 f0 m- T- T: B' V6 v
2 S |7 [9 J) j8 Q0 Q* x1 W
button_press: ;按压操作$ l4 l$ i. J% L; b: i# T
ini_Y:
- I5 X; O& \, _! W8 c. _8 O8 ~ LDY #$001 J) X0 E# H8 Z, L
button_cmp:* V8 M" |7 x5 }- A2 J
LDA button,X
0 G" a0 P4 t$ X5 q! D CMP ora_data,Y
' p P7 N, @# M BNE count_Y_cmp
* I p% f9 k: |3 Rflag_cmp:* A4 y1 A. E" G% p9 h
LDA flag,X
/ g$ T# l/ d( @ AND ora_data,Y
9 X6 v I- G; v$ }0 Y$ u BNE flag_and
$ @- a+ B* n' E7 a# k* [flag_ora:
$ ^5 h; P. l% U4 w, { LDA flag,X
# ^6 {2 ]8 i5 H5 O$ V$ Z5 [ ORA ora_data,Y
( }/ R. }" Y* _8 q5 ] STA flag,X
! ?) K V* B! h6 A# H0 n BNE count_Y_cmp- k3 o: {6 O2 o' g( Q# p
flag_and:- F. C' C# Z/ d
LDA flag,X& E+ N2 W. ^* E1 {
AND and_data,Y
9 v5 }; `- y0 V& j STA flag,X
8 e* R+ r% m; u; q" ~9 o0 u) ]count_Y_cmp:
% u/ u! U! O& E% X5 @5 d INY
1 m3 `0 X+ h. W% z# F CPY #$08
9 ~% `) E [7 f" X3 { BCC button_cmp$ y6 L! I+ J; P8 x8 {3 s
, t) ^7 k6 g9 f" W
data_extract: ;数据恢复
6 J1 K: a) z* N( I& t PLA
& l5 m8 m8 i' ^+ R1 m% U TAY
) n6 G- v2 o+ B! i PLA; M6 I6 y$ R( S; W9 b
TAX0 V v# l' w# [/ D
PLA
9 k2 N% R7 ]+ Y, n
6 Q ]0 h0 d& R, s$ g$ m4 y! Q1 breturn:
! A4 I" _+ N! [# @% v! c/ j RTS w* {- M( e! k9 B
7 H. f A0 \2 ^* p$ o! h0 F% C
ora_data: ;按键相或数据0 O+ D7 H" \" k K! S
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
+ U! [" E8 ` | gand_data: ;按键相与数据6 a1 @- N3 e5 h3 \$ t
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF* _& N, Z+ E7 Q* }: G3 ?& I: p- @
/ [8 f9 m X# [! `1 \. X2 Z
& r8 `3 S1 y# r. D5 N9 C
% Q# Q8 w$ j5 u4 C ;FC数据搬移程序 BY FlameCyclone/ F5 @% h9 A+ a) W7 a
.ORG $82000 t5 T- m7 V! |
JMP DATA_COPY_PROTECT6 c. f$ q, X! h7 z _; ]
3 G {1 ^' m$ P) c1 uADDR_DATA_TO = $40 ;目的地址0 l- _- D7 w9 b! f
ADDR_FROM_START = $42 ;源开始地址
4 |5 i2 G) n h8 e1 gADDR_FROM_END = $44 ;源结束地址
3 `! K$ ?( U2 K# f1 B5 k. E( h+ R. }
ADDR_TO: ;目的地址
$ n! b/ {, T/ C .BYTE $00,$70
, X6 s$ f# B/ \: Z* k+ UADDR_BEGIN: ;源开始地址& f5 y+ G1 N! w, ^
.BYTE $00,$83
3 b j: D1 O7 T+ V$ lADDR_END: ;源结束地址
8 d: t. E1 L( M; O8 | .BYTE $FE,$84
, _2 A( U! v! Z @# K+ U' ~+ m" o* X% |$ r: c' L$ u0 E
INT_ADDR = $08 ;中断地址
6 C1 e) X& `4 i% o0 lFLAG_OVER = $71FF ;完成标志
8 z! } q, Y6 _- q/ r/ V8 q% u( l% N$ m) e4 Z4 g- Q9 j) E& `4 g
& r- R. y7 {' @' m) lDATA_COPY_PROTECT: ;保护数据& n |2 X1 ~8 C3 ?# f& G$ e2 j
PHP
1 R' q O, d4 ?7 P& t& { PHA
0 F. k* a7 g, U Z" [: k TXA
: a |; @: N5 c: U PHA
* i P6 R1 a. F* m0 O4 _ TYA
, O$ O+ m: u( C8 r PHA
! H: k4 n' X3 i" Q; `6 s LDA ADDR_DATA_TO" n |6 Z6 ] e4 `9 N
PHA
* Q4 S$ D# Y8 C9 L. L LDA ADDR_DATA_TO+1
6 O0 L$ U( a2 `# Z( z( s+ ~- p, R PHA f; ]' `( \5 }: o0 d. p: I: T
LDA ADDR_FROM_START
+ f9 Z. [$ v% ~% c1 g1 k PHA
; W% \2 V# N) E8 q" p0 { LDA ADDR_FROM_START+16 t% {" j- N; I
PHA
8 m2 }7 m" Z( {, M5 q( b LDA ADDR_FROM_END
6 E9 f( \- ~6 W% s PHA
2 p6 T# [4 C! H8 S3 g. [0 J F LDA ADDR_FROM_END+14 k+ g# s9 k0 B; R( h5 h
PHA; D2 ?, V' _# v! w
9 s! k' [6 ~& m# n- e$ n+ sOFF_INT: ;屏蔽中断* T$ i% g: V! s+ [
LDA INT_ADDR
! N# w" P( A& y H9 j1 \ AND #$7F
2 H5 q0 n3 @" w X4 v# U8 r. @7 M STA $2000 ;屏蔽中断
& Y8 _6 W5 ~3 F
+ }* S& D: d. J1 r% b4 X) | 2 ]( D' g9 _" F0 W' ^1 R! R' M. M2 x+ k
SET_DATA_ADDR_START: ;设置复制起始地址8 `0 C T4 T7 }5 D/ _. @5 V
LDA ADDR_BEGIN
: Y' q8 Q8 h+ s- B) e8 t STA ADDR_FROM_START ;设置复制起始地址低位
+ s5 z1 ]' j. z& e7 J4 M4 D LDA ADDR_BEGIN+1/ n, j0 f- H5 a, J. |) a7 I% H$ r
STA ADDR_FROM_START+1 ;设置复制起始地址高位# R6 ]/ S7 _$ ]6 |. K% d
5 s3 [1 u1 {. H' OSET_DATA_ADDR_END: ;设置复制结束地址
" d+ h B2 V) D: t4 d, Q, N LDA ADDR_END
: R t6 Y( i4 K9 @8 e8 ^ STA ADDR_FROM_END ;设置复制结束地址低位
5 ]% |7 `/ v& j- } LDA ADDR_END+1
5 a' K3 |$ j. {8 w0 X5 ? STA ADDR_FROM_END+1 ;设置复制结束地址高位
- g; z8 n! Z" o; b4 R- Q
+ d, e$ K5 M/ W) [+ h8 C4 G% wSET_DATA_COPY_START: ;设置目的起始地址
- R0 l& R4 T# q LDA ADDR_TO; C3 C* [7 ?# Y$ y- y0 R4 M
STA ADDR_DATA_TO ;设置目的起始地址低位 Y( f+ x% F% W& Z+ @
LDA ADDR_TO+1, g4 f5 K% y6 P* l0 }, D
STA ADDR_DATA_TO+1 ;设置目的起始地址高位 C/ m0 u4 x' t& s* [% m, v
8 T) Y2 d3 M c d @
OVER_COPY_CMP: ;复制完成比较1 w6 [/ p2 |) k
LDA FLAG_OVER5 V; W8 c' U5 x6 @4 B/ e
CMP #$FE ;复制完成标志比较
" r6 o L; J. s BEQ DATA_COPY_EXACT
0 |. J( V' ]0 L4 m- {6 V5 ]" k2 c5 b; b9 H; _
INI_XY_COUNT: ;计数器初始化0 v/ Z: b% k9 m% W- h, L
LDX #$00
8 [/ X, k2 Q% C4 c7 i LDY #$00, F1 r# ]5 {% m6 @$ \. R
$ C$ [* k( p I: I R2 MCOPY_OVER_CMP: ;地址比较
( ^3 d) p9 d. [ LDA ADDR_FROM_START/ ~7 p( @7 J- D
CMP ADDR_FROM_END
4 `& C; @; A. o1 J8 N# G- K BNE COPY_START1 W, S6 N/ Y7 V0 p. L
LDA ADDR_FROM_START+1
" ]1 S$ k& T1 [9 m CMP ADDR_FROM_END+1# \. b9 `" m) ~0 }8 B* g. J) c
BEQ COPY_OVER" K/ c) f4 h6 K. k4 l( u: k
9 q; B8 j" q- k2 ?6 E4 i% Y: v% V0 d
COPY_START: ;数据复制开始2 {. y1 |9 E+ l' h) e0 n
LDA (ADDR_FROM_START),Y ;读取源地址% p2 r) s' C4 u' g( x
STA (ADDR_DATA_TO),Y ;写入目的地址( d- x4 ^! k, h
INC ADDR_FROM_START ;源地址低位递增9 D% x P7 j) N1 p6 w7 I4 E
INC ADDR_DATA_TO ;目的地址低位递增
# K% b, M6 R2 y4 ~7 A( w BNE COPY_JMP; p7 q9 K5 K% `" E* K
INC ADDR_FROM_START+1 ;源地址高位递增
: I; M4 z( d. A# B$ K$ B INC ADDR_DATA_TO+1 ;目的地址高位递增
) N% m+ T O8 b& v: Q : x! Z4 x' V( g9 f0 T
COPY_JMP:
) l6 d- P' V# ^ JMP COPY_OVER_CMP) y3 N1 g$ C0 B% l4 P+ @
+ i% P4 O1 b# {1 t1 \5 qCOPY_OVER: ;复制完成) S: |# j/ h! W. z
LDA #$FE
' G" S; `& w4 |& i STA FLAG_OVER ;写入完成标志1 ?) U6 h- Q( n7 G c
FINAL_BYTE:
6 L9 ~7 v* f! x6 p LDA (ADDR_FROM_START),Y ;读取最后一个字节8 A2 B2 R: {# t' f6 i6 M0 Y
STA (ADDR_DATA_TO),Y ;写入最后一个字节
& G( _ b& x( S7 } ) J, H6 \, s# V6 i- M/ z
DATA_COPY_EXACT: ;恢复数据
}+ t d1 L: X$ v3 M8 B5 z7 ] LDA INT_ADDR
: n$ h+ ]$ a3 H STA $2000 ;恢复中断
1 g6 w/ h* P# G& P7 O PLA1 ~5 F9 w4 f* s1 `. H
STA ADDR_FROM_END+11 P) p! b/ q+ ^" W( ~: d9 ]& f
PLA( s$ x" I2 r/ Y6 `' @: P1 c/ m
STA ADDR_FROM_END8 T- [4 e, _/ \% y* u
PLA
. }( }+ C/ u' T5 W. N STA ADDR_FROM_START+1
5 z' n, _8 m% V, i PLA! n% W" V8 M8 v# \' j: d2 o
STA ADDR_FROM_START
/ @" }1 N& L" b9 i PLA; h& C. E' L3 b, M) r4 p
STA ADDR_DATA_TO+1. a! {4 h% f, Y6 g9 y+ |$ N
PLA1 ]( a" |( Y2 O$ q
STA ADDR_DATA_TO( ~: [! q' V( l E0 C$ L
PLA* {+ i' x8 i1 C: P9 W4 o% q
TAY# b8 R, V, Q$ {6 x7 D1 h; }$ m
PLA& ^2 ^" G7 x+ V) }# m7 B8 p
TAX" f! ^7 n+ P; S. R8 G! L7 @% t
PLA4 Q6 m# j* b8 I
PLP
8 V9 o% A2 j$ b/ U
/ P: R0 u+ r& S& K/ L0 ]
% V" O4 j' G3 x: O+ }3 l, ~ 8 b- D4 j7 Y7 k* h5 r
DATA_COPY_RETURN:$ |0 d$ L* E" A. j9 r# U w* v- P
RTS
) |# i T, ?, ?( m; V0 M: N
$ W1 k& W6 o& r .ORG $C056 ;精灵指令覆盖
; q$ V% T ?4 |7 U9 L2 v! P JSR $FFB5
+ l' |! V( ]2 Q. t7 L : d4 \- ]5 A# s# ~3 F5 Q" ^) b
.ORG $FFB5 ;+ [ ~0 z7 ~* a4 I
PHA0 ~, P5 H/ p9 ~; j8 Q1 @0 K) J
TXA
+ P9 l4 Z% S: h, }, y PHA
3 K/ ]6 I; I8 n0 v TYA
) _; T5 O/ N0 P1 y* c8 s PHA& R: D/ x% X0 G4 V t4 r
LDA $71FF ;比较7000-71FE数据是否完成复制* K! j# E: f2 J0 X
CMP #$FE$ n0 L r: ~/ ?" q9 C& ~& U2 _8 p7 B
BNE ADDR_FFCA4 J5 ]6 z* ^& _* Q& b4 v9 ~
PLA6 R7 K- M7 `* P
TAY
; }/ R+ r% e0 s PLA! a8 ?/ a, E4 V s' g/ q
TAX8 Z' ` T1 }4 b5 U
PLA" v% E- {4 d7 ^
JSR $7000 ;跳转到自写程序
( [! g) H/ J2 X( q' i9 q% X RTS5 |$ N' I4 C% Z' B: M4 ?
ADDR_FFCA:
* L: ]: H2 A4 M; u* S' e PLA
' f1 i9 m+ t- ]8 _4 `8 L) I! u TAY5 a5 b( s# N$ C! u: {! c7 U
PLA
V$ v% v" ~6 {2 W* x8 o0 S TAX
6 g& X# B4 Y8 p) A- Y# R PLA$ W" K" O& u0 d9 w
RTS' `0 D. ?: s6 ~
: F# B8 W" [, d$ q3 c2 {. L+ D1 t1 j. V9 `" O% t
4 d: L7 [0 X4 Y) z, E/ Z
.ORG $C264 ;自定义的MAPPER2切页程序/ ~' B2 \! \! I, T
PHA! |9 x* u, X- y* R5 a( n
TXA
7 ?8 K' l* z# z( {, \8 R' [ PHA* [" U! o6 t5 i' t
LDA $0066
' B& T+ [9 @1 |. d BNE ADDRC280 I* E: f3 I6 `- l
LDA #$075 d# ^. e! B- ~& X6 m
LDX #$032 T1 H# S/ t. f' {5 H. ?, L
JSR $CD9B ;自带的切bank方法
: I9 R: g' t& `. s E- B2 q% f PLA
) s1 i3 F# I! }; h2 i' w. @ TAX) A; w- O) W, h* w0 Z, }: J
PLA
. ~, S* r4 H/ ? JSR $8000
2 }1 v( z7 u9 m1 J LDA #$06
' l# J6 I6 X. o" n- r% p, X LDX #$03
% z' v7 ]" w- S JSR $CD9B ;切回原该切得bank(可以不用)
. A: p o W5 A! j4 n RTS
/ E( x9 a8 {- j- o3 R2 x$ XADDRC280:. N& E+ o# s) u+ p) x1 A8 D$ w8 ]
PLA
x5 ^: k* W* e8 V) L$ J' E TAX
$ G) E1 r) j) I9 F PLA- Q- a+ s/ p% z! l& x) L* G
RTS ?1 u7 g3 }1 Z1 v9 A5 W
; M; W1 A! ]0 `) ?0 ]# F! U3 O `$ \* ~ ( _- Q, x O0 O9 [7 s N. o
;[FC][最终任务PPU][END]4 ]1 Y9 c( p7 _0 {- ]4 T+ F- {
.ORG $C056 ;跳转到PPU重写程序
, [8 ?! ?$ V7 l# }9 I JSR $7000
, ]1 A8 D5 T0 Z$ m4 S, ^* e3 ?, S9 |$ x' Q. g& J: ~$ S, }
.ORG $CEBF. R# i7 ]2 y0 _9 z, }3 I, d
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
, ]3 {2 _ w, \8 m! f% ~
* W5 x T8 |4 Q' n1 e& \6 j o! ` .ORG $E460- N# H0 I1 y* ^4 y% ~
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入- N, F* c' n( ?" T! u) S
3 g0 ~ e2 u3 w) J
.ORG $71F0: d, p' w" H& l
STAGE_DATA_WRITE:
! c' ^7 D" g& }9 y9 y LDA $6010: B" \+ s( Q/ |+ P* K
STA $1E ;关卡写入7 `0 m+ |9 R8 F( z$ ^& T6 y0 ^
LDA #$00
# _! z. f/ r% D* ?3 ?- e8 K RTS
' G3 J9 c7 M3 h3 T+ J .ORG $71C0
0 q+ r2 v7 w' D5 gBULLET_DATA_WRITE: ;副武器数据写入4 T! |. J, i% L/ P9 j! K7 O4 Z- a
CPX #$0E/ ]7 e9 L/ _5 ]/ L* N, \
BCS P2_BUL
; @0 v# s+ r" h0 e7 t* F! hP1_BUL:1 }) K! x& f% ]8 O
LDA $60043 G( |2 G) ~, A
JSR $D7D0 ;P1副武器数据写入' M/ T7 B" m1 P* S& P7 z+ H2 g
RTS
, D3 K" w: ]) H! U& kP2_BUL:: [, c0 t% P% I0 c1 k; D+ h7 E
LDA $6005. I/ V' U! n; w2 ^/ f% N
JSR $D7D0 ;P2副武器数据写入* q+ N+ f$ q5 W9 _9 [, i9 V( E
RTS
, |' p( R _1 J; ~; R$ a9 l- _: c4 ~% g' S% F5 U
) T& i" d/ W; [# M3 ~ .ORG $7000
$ W2 m8 Z I' S5 O " A$ B( i* A) z$ l+ q$ [
STY $4014 ;补上覆盖的精灵写入指令
6 @2 ~$ z7 c% | PHA
$ `3 a, d$ L0 G$ @0 V TXA" H$ z3 |' C7 r3 x8 E* o
PHA* [; a- y% G1 `8 |
TYA
* c; s4 s2 Z' @# u PHA9 _9 W2 N1 J4 T1 h6 @9 x
LDA $0C# G- O$ D- @4 ?( }2 M7 m% [* b! E3 c
CMP #$01 ;比较是否为标题画面
, U- n) ?, x, |8 \* F5 {7 f BEQ PPU_STAGE' `) U& U7 m) Y! j
PLA
" V: T2 L0 s9 f- Q5 q5 K TAY) D) i; B3 T" Q
PLA/ P+ |- e' J, D5 B$ l) m8 @: ]. c
TAX
( D/ {( i& r: F9 c" G, j. D5 z PLA, \3 {* ?' a Y; H
RTS. |# k! L* E8 F9 u
PPU_STAGE: ;STAGE显示程序: U* c# \: a8 ]% m$ y
LDA PPU_ADDR_DATA
2 s1 I& D" c9 D STA $2006
1 u I2 \! ? v! { LDA PPU_ADDR_DATA+1
* o+ r/ B; y$ d+ \# ?/ f STA $2006 ;坐标设置8 w$ I {9 U* f5 S/ J' q
LDX #$00! |3 y9 a; m2 M X+ V6 t( S+ e
PPU_STAGE_WROTE: ;写入STAGE字模: v7 ~( v0 q& \' i1 h
LDA STAGE_DATA,X$ f5 I" Q$ F- t5 Y- Q: n
STA $20073 E# i8 S# v- H( {
INX" W5 H% {* n& K( z' k3 Q, o/ j
CPX #$06+ s- G, J9 n! f" H( J
BCC PPU_STAGE_WROTE
8 \/ `2 {7 A4 p LDA $6010
3 f8 @ W# f L* r) m) c CMP #$FF ;关卡数据初始化条件判断% D4 b- p3 m7 j! s
BNE KEY_B
8 D1 s/ x$ e. ^% E; ~7 G3 t LDA #$003 x5 n1 Z( Z' ]" q
STA $6010 ;关卡数据初始化; C5 u& ^( m) E# X4 l9 u$ L
KEY_B: ;关卡减少
1 ^: K: a c- [* \. r! y4 p N1 F LDA $041 @) T, l( [' S, j( Z
AND #$42 ;按键B或左减关7 Z' H: b0 T, @% I, z& G+ y
BEQ KEY_A0 @6 ~! M# \# s1 F
LDA $6010
3 c) b1 a/ B2 b a" m) o* N3 { CMP #$00 ;关卡比较2 S) s, t- [( G
BEQ KEY_A
2 J( T# Y2 N! H0 \7 W7 ~) ~ DEC $6010 ;减关
! g8 R5 _. c% |' a- oKEY_A: ;关卡增加$ v- _& V. H8 W2 A0 [5 V9 p
LDA $04
5 T( R0 F- O* O8 w: @, T. U AND #$81 ;按键A或右加关
7 M/ l6 L, y* f7 L$ U0 p5 J BEQ PPU_NUM_WRITE- l2 R; [6 k) Z& D* b- ^4 q/ U5 n# ]1 }
LDA $6010
D- a' Q' e: x7 h) J2 a& F' ] CMP #$04 ;关卡比较
5 u+ Y9 A* d& N3 S$ l BEQ PPU_NUM_WRITE
, |; W1 e% X% j INC $6010 ;加关7 q* N0 B6 \/ U. [; A$ `4 n! ]
PPU_NUM_WRITE:
+ m: Y4 Q3 [% q$ V/ l* C) T LDA $6010
. ~( ^$ G6 N' s& A TAX
- o& X' F3 b X5 p0 B+ F# X! _# A LDA STAGE_NUM,X ;写入数字/ ?) M, O# Q1 z
STA $2007
; R* [9 W5 X3 V H+ iPPU_RTS:/ `! d# h- k$ T i4 h5 ^+ P' }7 z. O
PLA, O3 o3 A! |$ n' `$ \% M
TAY
: H! \% Q$ x" y* @ PLA
5 ]1 [' T+ o2 b3 a2 S. o TAX* {* O6 l8 P: |; v* I
PLA v; e6 k% j$ `1 u
RTS- i; F$ K5 S+ d
& I5 I2 v+ U- m$ ` U$ f - a; T! M4 [+ B" Q* w, F
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据& L+ w }- J: x- r* [( o7 N
.BYTE $EC,$ED,$DA,$E0,$DE,00- o8 u [& b- E( P, x+ l
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据
% ]! |! Y$ ?8 ^' L .BYTE $D1,$D2,$D3,$D4,$D5/ M* g! h$ _# }: \3 s
" t! b6 u6 K+ W8 }/ _: ?PPU_ADDR_DATA:
% c5 |: `, h8 D2 f% U! [ .BYTE $23,$0C! d8 F9 f6 Y( g- n% e* N) \
* S$ g W! g6 h5 C, n |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|