|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
& k: r# [3 S& b) E. x9 x+ ?0 E U A. I- V- B1 p) _
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.$ w! i' A# r8 B, K( @5 c& X& @
然而,今天想到一个思路.1 b3 h. c4 l4 C! D* @
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.- n3 y& o) a; X- s5 P5 L
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE5 T7 \# h5 Q) F% n
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF)., }. X) P$ N& s5 j8 [. U: D& Y: N% \
) }7 m% }' {: S _1 F
) F( f' C+ L: x' \;[FC][最终任务KEY][END]. p0 K% [) K" C; l' U7 B4 L* I
button = $04 ;单次按键& E! f {" }9 B! o) T! i* x
flag = $6000 ;功能开关标志. o& I! u; K, j s4 R
pause = $000E ;暂停地址/ J6 {* W9 n8 y; Y! n A' I) C0 n
* Y; S8 E; t( W( z# V
.ORG $8000) E! {% {& G7 v7 X
LDY #$08 ;自带的按键程序
F% H1 o% Y4 A2 c% y, PADDR8002:
7 R& L& ^) y9 b. I( ` LDA $4016,X( ^. `' o, q* n( a& r
LSR
- U$ ^, E. e; b ROL $0021
$ m* _' n8 ^$ O' n/ }% w" _, w$ r LSR/ H! f% m6 i- m
ROL $00292 V2 |, d n7 ~( u" R! J
DEY
; x1 B4 s3 o$ S BNE $8002" R" w/ q& N+ L- }, w! P
LDA $0021( X$ C/ d' f* v w4 @0 d
ORA $00294 x3 v( Q6 [1 W
STA $0021
5 |* h" m, y# G% p LDA $0020
/ w4 x* N( |2 a4 T' y AND $0021
9 C! D: A+ E/ w' X$ V; ^' T$ u STA $0020( n# L$ S% {, m- N4 X
LDA $06,X
% t/ y! s7 ^0 Y& O, v2 F% }1 W EOR $00203 e; ?9 Q7 h, C$ q. G4 v
AND $0020
8 [7 q8 p8 l8 \0 O; z STA $04,X
( l5 S! S2 d) f3 S8 h0 o LDA $00208 I* V2 D# H- S. C. x
STA $06,X
. O& j* s# \& Y( e p& B5 R5 g9 g JSR KEY_OPERATE
1 I- t' _8 M+ T$ S JSR Function ;功能调用
! d% G" K+ z6 p A9 U8 X" j JSR Weapon ;武器切换调用1 Q" z& P9 W' H6 g+ a1 Y
JSR Power ;威力调用
& _/ s8 w% S# }; A' Y JSR BULLET_NUM ;子弹数目
% _- O2 V0 Q$ }) c JSR BULLET ;副武器类型
7 @8 Y1 ^6 ~; r2 R- o }1 c2 y RTS
& Y3 T2 R; y: @+ [
3 F3 v' l) t+ P$ u. D
1 {: o0 e: W& z1 ^1 i* f6 e/ L' y! }+ ~. p
.ORG $8050$ Q5 X/ G( T+ q9 N3 i* x% S% Y0 E
Function: ;功能
0 Z5 i. C$ n! VWUDI: ;无敌( W3 {: O, g5 c8 |- N, Q0 u
LDA $6000,X$ g# P5 d7 g9 l# e
AND #$08 ;开关判断- Y& B: b7 w# Y6 v0 Q& N! A6 n
BEQ LIFE6 h; v M4 \' k4 E3 i( c- z
LDA #$05
. D( B5 x* W: ]( I STA $05DC,X ;无敌锁定( a: R8 f: b( W% n/ G5 ?7 |2 a
LIFE: ;生命
! u# u! Q$ c7 P$ }) } LDA $6000,X9 l1 u! [: P3 P- Z+ y) M" B7 Y( q% m
AND #$04 ;开关判断8 n! y; S3 C& |" l, l
BEQ FUNRTS
. P3 e! M" D- Z0 c7 { LDA #$059 W$ h9 d& t% m4 Q- {
STA $1C,X ;生命赋值
N. c/ R# W% A) \; oFUNRTS:
]" i' j' M9 b3 x" A9 K4 @ RTS
, [- p$ y- {* |; A6 W 2 m/ a5 z. V/ t/ i( ]( g# M
Weapon: ;武器切换4 g' N Y4 K c/ ]3 O. [
LDA pause ;暂停状态判断
! K. u9 \3 i2 E; P BNE WEARTS, A3 g, t3 ^& I9 d: `7 G0 h
LDA $04,X
% G) ?' A, D% M/ @ CMP #$20 ;选择键判断1 J! Y/ r$ n1 e7 V
BNE WEARTS
7 n. |: j! Q( s LDA $12,X0 \6 }1 U& j% F4 H. O* w' c
CMP #$03 ;武器值判断
% u0 U, H! D+ P: `7 d! S" p BCC WEAINC
: V* g# W! K9 P( t LDA #$FF
5 |! u! d, G- x8 Z B! \0 T STA $12,X ;武器重置
3 J5 p) X$ \9 ~0 tWEAINC:
" ?% z P J( ~1 l+ i INC $12,X ;武器增加
8 `3 Y! x) T' n* ^+ n+ [ 4 p1 h7 W" V2 Z- `
WEARTS:" x( o! h9 i: V+ D6 k6 M+ e5 c. X+ K0 O
RTS
# ? t$ ]2 z( r% j/ g
3 U) E' C# u ^& a/ jPower: ;威力
9 F/ ~0 Z7 t7 ], t2 i LDA pause ;暂停状态判断
0 B/ v$ [( Z; d# O BEQ SPERTS/ b6 U7 f0 B- c
BUT_LEFT:
7 e7 c' F8 J F! q5 k6 o LDA $04,X9 b+ ~( Q6 K) w( ?6 z* Z( t0 N5 d
CMP #$02 ;左按键判断0 V6 ^, L! }, V
BNE BUT_RIGHT& N+ Y$ p8 T9 {
LDA $88,X
+ r# j3 U0 ~: E- _' V4 Z+ R CMP #$00 ;威力判断
0 w' Q6 d% l9 A9 g2 l- j BEQ SPERTS
4 u, n# K+ A8 |. VSPEDEC2 d) [3 B8 D. e& L7 Y
LDA $88,X ;读取武器值
6 \% x! b5 N7 F) \8 s6 d" q1 s$ ^ SEC h6 f6 o! } f" K8 L
SBC #$088 T8 ?" \4 ?7 s6 {0 T
STA $88,X ;威力减小
. h& n) Y! `! A3 k% w8 oBUT_RIGHT:8 c) `/ C' C# u8 B: V R7 ~
LDA $04,X0 H# k' \ L& G& }2 u- X: v
CMP #$01 ;右按键判断7 r, B$ p7 z3 [" j; v0 v6 C' |( n* N
BNE SPERTS
8 E T$ G+ {5 ^( a r5 _( ]3 s LDA $88,X; K* r8 V0 q; L" G7 x
CMP #$10 ;威力判断
7 a; K( ]9 p0 Y BEQ SPERTS! X# p$ u" R+ u3 w+ S
SPEINC:
, L3 }0 ]9 h( }5 w% C& w/ e8 P LDA $88,X ;读取武器值: i1 i" e1 \9 z% r2 n7 j) }+ |& D
CLC
* [1 [9 H$ a& `: ^2 ]9 G. ?9 _ ADC #$08, t, _& p _+ V; O; N8 }) r' d- Q! M* D5 G
STA $88,X ;威力增大
( @( _ s7 Q5 f7 T; L, k 8 H6 k& h' ]3 U& U4 z/ x, o* r
SPERTS:
: k8 E& M4 ]& C8 { RTS! d. }, z; U' ?
* F0 S+ q- z9 c. E3 V- Y2 `
BULLET_NUM: ;子弹数目
# ?" ?+ ]1 I2 J LDA pause ;暂停状态判断
! \* `7 G+ y4 l+ Y) d C# V$ h BEQ BULRTS
! k! Y% Q% T4 b" v. g! B& a CPX #$00 ;主机玩家判断: Z8 m6 L- ?4 R0 E5 H0 t( i- C
BNE BULRTS9 u7 i, y- ^7 z. H% @* J) @( A% W
LDA $04,X ;主机玩家判断
$ j% [7 i+ m8 J3 K* @ AND #$80 ;按键A比较8 u, b5 K% e" t8 U- Z6 P
BEQ BULRTS
2 L$ M+ B: f. A$ \2 w% u; f, l3 y& }- Z LDA $87 ;状态判断/ `2 f! f* Y9 g& R c( E" A
BEQ BUL_2
0 E+ |" s, `& ]. U. UBUL_1:
, z' R) d: U: j% F! x1 o4 L. y8 ]4 ]8 A LDA #$00
- g; u: R- U. _/ ?5 D STA $87 ;1发子弹& |. c* b( y* ] W, ]5 Q9 p
BEQ BULRTS
; J& N# {: z3 s/ LBUL_2:. v: M! D- j) u
LDA #$019 ?! ^( x- i8 f& S- f
STA $87 ;2发子弹
1 z! a4 }' W1 X" L8 V5 V 2 \( P& x- i) _) C& j! Z
BULRTS:4 E: d5 d; n3 E5 s! `5 o* q
RTS
0 d& e V$ D1 K* K" F. D 0 t |, D" g+ Q z$ n
+ G0 `* k( x" u3 I# t6 Y
BULLET:6 U7 p! m- P9 c0 D% z
LDA pause ;判断暂停状态" Y& ]. Z' c! _% E
BEQ BULLETRTS' L; h" J3 K+ E0 Q5 `+ U! i
LDA $04,X7 Y& Z# _" Z& b7 N
CMP #$40 ;按键B比较
& K( T5 l7 P* w* x1 j BNE BULLETRTS
3 d. L0 s% W: n, j( P4 l% ] LDA $6002,X ;读取副武器
" D( B& U! o. n+ S; Z+ V CMP #$03+ }9 W6 s0 c( _6 V' y- Q
BCC BULLETADD6 r2 g8 T4 |" m
LDA #$FF$ r' e; v; X2 @1 r O- q
STA $6002,X* F5 }6 x3 D( T* C, r
BULLETADD:/ e& o. C7 ~8 g- W6 P) d! z1 l
INC $6002,X& _; x4 }1 H; g% _' K& C8 }
0 Z+ E5 X* C( a9 cBULLETRTS:
* A! ~* A8 a# m7 K- ~ LDA $6002,X8 {6 Y5 }+ j3 _0 u* b
TAY
6 g" z( U/ B& ]- A LDA BULLET_DATA,Y( u" b; y" R7 h9 y# n' Y; `
STA $6004,X ;写入副武器数据8 E. ?4 k8 w. j7 o( I7 ?+ ^6 M
RTS1 P% q2 b. n7 b4 G% c
* ~+ l0 W6 Q( [9 S& F8 o
* | l2 V% A4 R- [7 S& ^' }BULLET_DATA:" }. E# E5 t5 L* J
.BYTE $06,$02,$03,$04/ j- w: V4 B7 [% y3 s
& v) M" [8 ^ Q' A" o
; t' X+ l4 Q* l4 t% v
6 \- y# t# a! p# S4 ]; ^1 p& c3 R. jKEY_OPERATE: ;按键开关操作% X- k. H1 _* \, ?+ s$ t
data_protect: ;数据保护/ A |! x; x4 _2 z
PHA: `8 }4 p h$ k2 ]" T, a/ u% `8 k
TXA
3 S- Z) n. l6 o) a PHA7 q7 P% S( I7 Y9 F
TYA
! @8 k, N2 { B- F PHA
% c; ]5 ]6 C8 P) r! ?& ?# r$ T. h% z
FLAG_INI: ;开关标志初始化
$ F8 C! J. y$ r2 _3 k3 N: k' [% v/ q
LDA $600F
( i- ?- L: \# ~( F CMP #$01+ R a/ F# A$ \* M4 {% a
BEQ pause_cmp: w5 p1 h; z5 z+ Z- l" C! R
LDA #$007 T' D' j& W5 b/ K. f) \
STA $60005 C9 S3 z8 R% H: p% o
STA $6001
7 F5 i- s! n" H* F' g# Q STA $6002
/ d d2 ^' j* K, }. X2 F+ N3 f STA $6003, y/ Y" O9 w* t' y2 U, L: N& G) j/ {/ D
STA $60041 O1 e! O! m. ]
STA $6005
4 e$ J- f* m& x, I, F, S LDA #$01
- q M: k* M# g1 ]: W0 I STA $600F7 q' g* J( v3 y( X5 |- b
4 F8 a9 _9 h8 ^9 ]pause_cmp: ;判断暂停状态; `4 s' x' {* D! x3 ~7 }
LDA pause
/ X9 |5 d& J9 \7 H! G' {& Z5 n CMP #$01 ;判断暂停状态6 l3 l. v! {; @ x) X& i. t
BEQ button_press
* q% q1 ?! h* e' B6 ?3 S PLA
2 k! V$ l {% A6 [ TAY
" T Y; K6 t2 y9 B" b: V PLA* ~. P* L# T/ o4 j5 m
TAX
5 k: I# Z% B, n( s1 d# [: T PLA
) w$ n' U9 T1 y; W" z0 W RTS
; j }! Z" f" o5 m/ j( e- d" t3 q* r' g+ D* n5 b5 c' ~7 Z
button_press: ;按压操作
5 v4 l5 t+ x( Vini_Y:
, h+ F7 {) l. U) i' u& q LDY #$003 u% ^. O- h1 W. O3 \
button_cmp:
& @, o+ _6 G4 A( `/ T3 i- k LDA button,X
) f) o1 m% y6 {2 Z+ d# ?6 i CMP ora_data,Y
# U# A5 Q- i4 l' x* B4 x i: } BNE count_Y_cmp
0 a, x* N; F# N% |4 ^2 bflag_cmp:
2 \7 z: r: W F, ?3 {/ r! i9 J/ J LDA flag,X7 S# s' x' R r2 a# R
AND ora_data,Y
+ h+ d, i3 A. L BNE flag_and
# T; L/ b2 b/ rflag_ora:; d" H& O! H' ~5 X3 k F, s' m
LDA flag,X
" m+ G( p' u3 o5 }4 ^3 P4 o8 ^ ORA ora_data,Y
j H" z/ W# ] P3 X STA flag,X7 \2 a) y# n0 g- k+ ]* r: u
BNE count_Y_cmp( |# P& [8 P; l7 h: x
flag_and:. Q% C# j/ l3 u; V# X; {8 U: F* r# M
LDA flag,X
1 L* T3 h: p) p; p( t; z d8 d AND and_data,Y
7 A* T: q% x2 T$ a. ]( a STA flag,X, j) n) S, o: O4 V
count_Y_cmp:2 d3 N+ _; Q$ Z) f" C+ V- {1 S
INY
, s1 z2 Q( s# i' H9 w% v! h CPY #$08" w7 K. B, Q- H5 B8 L7 ?. d; b) V
BCC button_cmp
: F, O3 p0 f ?: T3 T6 R4 j: D
. a3 V- o' ^; l# x, M, `+ pdata_extract: ;数据恢复
2 e" U) F' T4 w: W, I+ A PLA
- Y/ y3 O/ o3 s5 q( b t' s( U TAY% r& B' `) t- \6 n
PLA
* ]: B) S" R3 H$ t TAX
8 ^2 |' T; s, ^- M6 X) M. e PLA
3 c# P! V5 I) h" l3 B' t" G: a
% P0 n: `9 m( ^4 m* Hreturn:
) {& ^. O7 F$ I# w RTS( x6 F/ ?4 A4 K* Y
; ]5 g h4 W4 N6 X4 q# t1 o( Jora_data: ;按键相或数据, [; |6 b3 f! X
.BYTE $08,$04,$02,$01,$80,$40,$20,$10$ C, X* j/ r! u" K( y. {! F
and_data: ;按键相与数据
% S9 P3 S- C. C9 m `1 s+ K; g0 ` .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF' {8 H0 t0 f3 f8 ^
: L: k' y, M7 L% ~0 Q
0 w! p# p* S# g6 e% O% b! E
0 [0 v9 y4 f: x ;FC数据搬移程序 BY FlameCyclone. m" V1 J- U7 q' m
.ORG $8200
7 a: j+ \- z; B JMP DATA_COPY_PROTECT
* n5 h. ]; Q- N* t5 X$ K
; m) ^7 Y8 Q, I8 s1 J" G" WADDR_DATA_TO = $40 ;目的地址
2 `9 C. Z5 J ~ADDR_FROM_START = $42 ;源开始地址2 j9 o( _8 M! h. I
ADDR_FROM_END = $44 ;源结束地址 s, m% ^4 }, a9 f
2 k2 ]1 y8 J1 @; s U; X
ADDR_TO: ;目的地址
' q, k# e8 l: I; u9 { .BYTE $00,$704 h6 I) S+ `2 d% ]+ c2 j; w+ D6 {
ADDR_BEGIN: ;源开始地址) A& ^- a5 @& y) f' N* u
.BYTE $00,$83
4 C/ v+ R7 y$ f* d& ?8 DADDR_END: ;源结束地址& D% b" X% t! I* L7 f' b
.BYTE $FE,$84' k- U# L y' U c6 [, x5 i
; |) a% h% A$ B- b0 ?INT_ADDR = $08 ;中断地址+ E% c% E+ d/ Q% G# u+ g
FLAG_OVER = $71FF ;完成标志
5 ?0 l: X4 Z. T( K1 p- P2 F* F& W X- v9 X3 S. l
/ L3 i" J1 l$ a" f' CDATA_COPY_PROTECT: ;保护数据
8 |3 q2 m" e& K4 Z7 P* r PHP
) e; V7 g: q! V PHA
1 ^8 w) D( }$ u- \. T! g% V; ?, ? TXA
6 `5 V- q, k: d PHA( Z3 j( i+ i% M$ t7 }% }" o ^
TYA
Q0 O. v6 e0 C" I; q3 t* z6 v" m0 m PHA: a: t7 p! j* U, q1 G
LDA ADDR_DATA_TO0 ]- }- `* @* O8 L( {0 J
PHA6 S0 y; _% C4 z9 ~' Z/ g( S* B( _& B
LDA ADDR_DATA_TO+1
2 A) ` J0 `- R2 t% K$ x PHA+ B! A( _* m6 g1 c9 {
LDA ADDR_FROM_START+ l6 R6 w' M, s
PHA3 ~; B L: V' V; W' ~
LDA ADDR_FROM_START+1- ~, O; b; Q# I. L) x
PHA& C7 i: r7 k. e j9 ?
LDA ADDR_FROM_END
( z. c5 h. i& @7 {) Z) z5 v PHA
% X% F; P; E* ?( @9 B LDA ADDR_FROM_END+1" j3 Z. [1 [5 S) ~4 e0 ?3 _& S
PHA
& j9 p _! R2 c# z( q% U
0 X0 u% w5 i) S: D- ]5 {* b4 mOFF_INT: ;屏蔽中断' L4 k+ _! u4 Y; g$ _0 F
LDA INT_ADDR/ l, \6 L2 B# `. i9 K
AND #$7F1 d h4 E" N Y4 D2 g7 c! \
STA $2000 ;屏蔽中断7 n1 T1 n% y9 d; N* _
+ I9 b5 T3 v! ~& z$ }6 ~5 O
3 l) f6 L; I" |" w
SET_DATA_ADDR_START: ;设置复制起始地址+ N! z- X/ d9 w4 B; s
LDA ADDR_BEGIN3 y# M* p1 }1 ]; ?
STA ADDR_FROM_START ;设置复制起始地址低位
) I# Q, V. }& ~9 d& e( G3 x LDA ADDR_BEGIN+1) l8 f$ F/ ]' m; d, r
STA ADDR_FROM_START+1 ;设置复制起始地址高位
7 ], r5 D) N2 C/ h- c' A 4 L" P* Q# M6 ^
SET_DATA_ADDR_END: ;设置复制结束地址
) b4 _9 D1 Z4 E: F" m LDA ADDR_END4 {$ f, E1 Y' O! t0 ? u/ U( g0 w* I
STA ADDR_FROM_END ;设置复制结束地址低位1 o7 G& y- @7 c8 O% W1 b! V
LDA ADDR_END+1
$ U9 d$ c" h3 s4 P0 l& J2 h STA ADDR_FROM_END+1 ;设置复制结束地址高位. K/ D1 y- t: p
3 y7 _/ ?" v6 F4 I) G' g! i6 DSET_DATA_COPY_START: ;设置目的起始地址% G# `; K# ?& H
LDA ADDR_TO1 {0 e( f, s. j+ I
STA ADDR_DATA_TO ;设置目的起始地址低位
) K% c3 r" r- h3 { LDA ADDR_TO+10 @& Y/ a! U9 ~; f( u
STA ADDR_DATA_TO+1 ;设置目的起始地址高位5 V& C$ }( x& f, ^; B3 D
3 w7 W y8 r, q" r" e2 m
OVER_COPY_CMP: ;复制完成比较
Y/ {+ X, P3 U( }" l5 D1 N/ b LDA FLAG_OVER
% w: T. X3 q8 z: G/ g' { CMP #$FE ;复制完成标志比较% _) _& F+ P( T+ \ Q; Y
BEQ DATA_COPY_EXACT
* S) O8 W7 i4 _7 G; v
. t7 u V/ m, J, W( [# u0 F+ ]INI_XY_COUNT: ;计数器初始化' a0 B2 C% }( e# G* D8 d
LDX #$00) Z: c5 `' P. E' N
LDY #$00
. {$ c0 v4 \, Z/ f! ]; ~( Y 1 t' J% M" }" A
COPY_OVER_CMP: ;地址比较6 Y w& [ d5 l7 H$ ]& P0 I
LDA ADDR_FROM_START
7 F6 v; z7 [" Q% p6 d: | CMP ADDR_FROM_END p1 b! y5 l5 H6 ?
BNE COPY_START
( r& m% f& T s8 K LDA ADDR_FROM_START+1
' b, l/ [: _6 x M* u4 @ CMP ADDR_FROM_END+1# ]# J) c* M: r4 j6 d
BEQ COPY_OVER
5 v* ]& B2 a4 X$ S" l
( y1 k" `3 }0 S1 i1 p) e1 `. F/ M" k7 \# v, [COPY_START: ;数据复制开始/ D: s8 _) W" z
LDA (ADDR_FROM_START),Y ;读取源地址
# v5 c" m! Z/ _9 U0 m STA (ADDR_DATA_TO),Y ;写入目的地址
1 Q* \' `4 F K `! g# s INC ADDR_FROM_START ;源地址低位递增4 H3 s+ e6 U5 r- n' T* F1 u2 t6 j
INC ADDR_DATA_TO ;目的地址低位递增
; X! k/ f0 _0 a2 [" a+ y$ _' z BNE COPY_JMP* c# w9 ^( O: g6 m/ N( p
INC ADDR_FROM_START+1 ;源地址高位递增
" I5 u7 c$ ]9 I+ C w; D7 T' d INC ADDR_DATA_TO+1 ;目的地址高位递增2 [2 U+ t9 u/ w) E- |
" C. c7 c6 w, X' @
COPY_JMP: : }( B& L! j% b
JMP COPY_OVER_CMP; Y# ^8 N/ _8 ~, L* ~# |( o, e; B9 P
( D: e; ~$ q- W
COPY_OVER: ;复制完成" @& ^0 S. H. ^ v% ]! }, v
LDA #$FE
% j) S* A2 Y: `: A STA FLAG_OVER ;写入完成标志1 V2 P- C, t/ Z1 N! l; Z' ]: ]
FINAL_BYTE:
# l$ |. ?4 D$ e2 m" c LDA (ADDR_FROM_START),Y ;读取最后一个字节( k2 _, F( \) P2 D5 \
STA (ADDR_DATA_TO),Y ;写入最后一个字节/ ]; e+ h* m3 h/ `) B# C' j% i, U
& }: H. N# ^# \; K% z% K7 O9 c& E
DATA_COPY_EXACT: ;恢复数据
: ^. ^/ P4 c" S+ s' v( ^ LDA INT_ADDR
7 }- F/ Q" q1 j# ` K1 w2 E' t STA $2000 ;恢复中断
/ O2 [- \& t5 [5 A PLA
* o9 |* _% D) k7 o STA ADDR_FROM_END+1
/ J5 J! |" \2 c7 z PLA
1 ]6 M& F5 @. o STA ADDR_FROM_END9 a" j; o/ w* Z9 q- Y. Z# W; X1 Z
PLA
$ x/ j6 l1 B( b9 \* N STA ADDR_FROM_START+1# X2 D) H( U* ]( f) R. u
PLA
- w0 T1 ^# N7 u8 w( b STA ADDR_FROM_START2 `- P+ L e& Q& T
PLA2 o. l0 `3 q& S, S
STA ADDR_DATA_TO+1
1 Y/ e* g; o% ] PLA+ u$ C$ L* y. A) X: g
STA ADDR_DATA_TO6 D0 R `+ B8 f* G5 V0 E/ K
PLA* i* V; b: f3 [. V
TAY
9 i* q0 ~6 F: V3 e; V" e( V3 r PLA. e* m/ a7 L: L
TAX
- c6 E$ s9 z: J& f' g" y PLA4 V! q# {8 c) |9 \
PLP: b, G3 g4 P# @
$ [* Y; f3 y1 j! m+ O! K' T
/ f- v3 U$ a* p9 U
+ w% O# Y+ y4 v6 r
DATA_COPY_RETURN:! y/ }0 j% E* z4 b
RTS- V1 K9 E* r' [7 C7 M
7 {) a9 Z' j( d# w' Z4 m9 k) b; c4 B, y
.ORG $C056 ;精灵指令覆盖
- T6 w8 k4 r+ i9 x, R/ {. ~ JSR $FFB52 P Z' k& i% w0 M% U0 q$ A1 v! N
- V) N$ I1 E3 J" K+ r$ C .ORG $FFB5 ;
) l: Q9 L* [8 X# I* c; Y0 O5 V2 i! o5 ? PHA, Y0 t; y3 ?. l% X/ E
TXA
) W" ~8 `5 q4 Y$ V0 ? PHA# F/ z2 h' P0 d" R! A) H C
TYA# u# y, _/ B- j4 o* j+ [3 Z) L) ^7 ]
PHA
! m8 Q) F8 I6 Z3 E1 C LDA $71FF ;比较7000-71FE数据是否完成复制
, p. j6 S, }' d2 }" ^8 Q4 Y CMP #$FE' B7 ~) @' T% E7 N
BNE ADDR_FFCA8 ~! A* y$ o1 b- \2 U1 d' E" x' _' ^
PLA
/ P- S( s- l7 r1 d+ E$ a) F TAY, S5 U+ D7 F9 x9 C" V9 {, T
PLA6 o7 {4 j! y/ V" |* O ]1 u" k7 D
TAX: @2 c! }3 _6 y8 s! u* X- X7 I8 H9 |
PLA% R( l$ j* R, K. y# n
JSR $7000 ;跳转到自写程序
1 F# C, G' s0 k2 f! G4 S. e- r RTS$ a' L8 |& [# }" u
ADDR_FFCA:
8 _4 t, o9 ^8 I PLA+ Y1 Y3 Z! T& B# U' t' M" N* h
TAY0 X8 V. R! b' G& e M! \' B& v* C* K% A4 E
PLA( Z& U ]+ |. Q0 `7 Z" r ]
TAX
7 H! ^6 w. f# U% n0 B PLA( d4 y9 Y6 B5 K5 [& p# _
RTS. @) G& T3 d+ K; c; O5 H$ E5 S' c9 w
- Z5 M# m5 ]8 H. d
2 S {6 d0 E5 e- ^$ f5 v: @
+ m6 ` i9 W! r. x, r .ORG $C264 ;自定义的MAPPER2切页程序9 I5 i3 a# t) z
PHA% k& x4 K) L L- s c, O
TXA* s' B. V+ K( ^0 d
PHA
5 S/ p4 h+ L& F5 ] A/ Q: o LDA $0066
' `" x' U- ~" A! G, v! v2 [( E! p5 F BNE ADDRC280
5 X' E+ Z. Z0 U; j* q2 k LDA #$071 h6 w& H* |3 G: K8 ]1 H( \$ O
LDX #$03
: F8 F, P V2 ]- L JSR $CD9B ;自带的切bank方法% M! |% e5 x) S
PLA5 a3 r& }; I# y( Y
TAX
8 B* V7 a. D$ g# j+ g PLA) a, x) Z( L2 l4 u, T1 I
JSR $8000: Z6 m) H" O5 K- p# Z7 F
LDA #$06
7 W2 M. ]% u8 S P% V LDX #$03
& Q! _0 Y; N) J4 V JSR $CD9B ;切回原该切得bank(可以不用)$ v$ |" ^ t& `7 L! d$ Z; d$ R5 S* ^
RTS
( G) V. R V$ D4 D+ J7 xADDRC280:6 `, V! q/ n9 p* R0 z
PLA% Q$ |8 w" P. u* }- `
TAX
- k9 O6 K: N7 a PLA1 o7 g s4 T$ s) C K" {7 d8 M- j- u
RTS
; }& v4 g4 H% j2 U3 M# ?6 q u
% P, H9 p& r1 B- J 2 v b% s0 M# Z9 A# T
;[FC][最终任务PPU][END]
8 Z3 ~6 ^% A; W5 N m/ d5 B8 N9 i .ORG $C056 ;跳转到PPU重写程序
: f( W6 g' J2 @& C, ]% _. ` JSR $7000
& ^3 L1 j* F" { C1 m" Q# l( i
0 E1 D! O' T1 E( m8 H6 S$ s; s .ORG $CEBF+ r3 }+ E! U: M( G6 {+ s
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
" o6 z, `! \' ~ 8 U$ s0 G. s' B* v, v3 T$ h- a
.ORG $E460
% P" x/ N# ^, l5 | JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
- _( s l/ M& t6 M9 \ e
9 X2 t! c1 ]$ A .ORG $71F0
& R, z1 e7 p9 WSTAGE_DATA_WRITE:' E. \5 Q4 h# [9 M! S6 Q
LDA $6010: N6 H% S' ?2 h3 F- ~1 Q
STA $1E ;关卡写入
2 ], N" Q5 u. y LDA #$00) I% T- n+ {# P/ I, e8 E, N" r
RTS( Z5 g' ?. E9 D- j7 i
.ORG $71C09 r \+ h0 h* D) l. t# j
BULLET_DATA_WRITE: ;副武器数据写入
' c/ D0 U9 D/ {. D! d: ^5 { CPX #$0E4 D4 o0 B- q6 h. L6 s6 ~8 f5 C' V
BCS P2_BUL% O2 e2 J/ _4 I# z0 x+ p4 P
P1_BUL:$ y1 M0 o$ B1 v
LDA $6004' Z3 M* L! P1 Q D# G2 r
JSR $D7D0 ;P1副武器数据写入
H8 M+ N. z4 f RTS% B2 k/ P# n8 q2 q D1 k
P2_BUL:
8 L4 n4 r/ ~5 } d _7 ] LDA $60059 A" V6 M* e0 t, \& b0 D- l! x
JSR $D7D0 ;P2副武器数据写入
) s+ X% T; e5 [$ M+ j RTS
/ j0 u% h9 ^6 `3 O$ V+ u1 S; N$ o- u& c3 E& [8 N
; n d, c3 v0 X( X8 I .ORG $7000
( z7 `8 c u" t% e) f, c & X4 \* u. [: [/ b
STY $4014 ;补上覆盖的精灵写入指令% B/ ~* F/ \6 O* _; p
PHA
6 @& T& x+ O" o% S# Z0 p TXA0 e; k! D3 }, v! ? ^. t9 w! i8 m
PHA8 B. Q, v9 |9 b6 V
TYA
% E, h8 |5 ~# M+ E PHA
$ `: I$ H4 G+ j! Y: b LDA $0C( N6 e! R. ~6 k3 b( E7 H4 a
CMP #$01 ;比较是否为标题画面! S5 C6 o" A7 A* v
BEQ PPU_STAGE: o; C; m+ O2 g+ z+ ^
PLA r$ Y8 y; \' Y5 Q& N) A" w- E
TAY
8 X$ N" w0 t' ?1 V& h, G+ @ PLA
7 [, T$ {9 z% d7 n7 a! S9 m$ }! m TAX
$ Z* n: d3 ^7 K) [$ r5 j; @9 H/ W% D1 }' v PLA
2 p9 ?! V8 q% [5 } RTS
. @" W8 U# m/ t% Y2 X4 K5 mPPU_STAGE: ;STAGE显示程序4 ^- v9 k& C3 d+ T; G$ O
LDA PPU_ADDR_DATA" N+ Y/ \# Q# F) z2 J
STA $2006
9 i9 |5 M5 P& ] H- t LDA PPU_ADDR_DATA+17 ~- R5 z2 @ S S8 ~; M* a4 c( a
STA $2006 ;坐标设置
4 _! i: m) }( B- a* h' e LDX #$00
+ i5 E! I/ Y( W: KPPU_STAGE_WROTE: ;写入STAGE字模3 h7 {( Y9 c# r0 ~8 i
LDA STAGE_DATA,X
+ w& S. S( @2 n/ a! P/ x STA $2007* ~8 s2 Z+ T: G1 g( Y v2 y: s
INX `- `6 r* t9 B: J4 O7 ]. j: x
CPX #$06
5 J8 ^/ G8 Z* p3 r+ ?, i6 T! A BCC PPU_STAGE_WROTE
1 _3 u0 k* C7 T# F$ |' v LDA $60108 s1 A ]% f7 H& y& u4 U
CMP #$FF ;关卡数据初始化条件判断; m) u7 E- c$ U. ]
BNE KEY_B
' q0 J0 M1 ~' j7 z& v7 r; G7 A K LDA #$00
) J$ k: o& U( n STA $6010 ;关卡数据初始化
4 s: b- y( }9 W' PKEY_B: ;关卡减少6 R2 R0 J$ o$ R+ M+ Y3 {/ L
LDA $04 `: ?" w4 n9 P9 t% @
AND #$42 ;按键B或左减关
4 T: S8 w3 [& \$ V$ H8 N BEQ KEY_A
! {/ S( h8 `0 ?' P, ~8 O N LDA $6010 l5 q: }* m$ ~3 s
CMP #$00 ;关卡比较0 ~' L5 ?1 e+ \; I
BEQ KEY_A3 u9 h. R. u! T5 S
DEC $6010 ;减关5 e' P4 `1 \9 C0 e& f3 }
KEY_A: ;关卡增加
1 w6 \! u: t/ H' K4 T LDA $04( j2 ]3 N2 P3 ^3 F O: w
AND #$81 ;按键A或右加关) }" z: b r5 i @
BEQ PPU_NUM_WRITE
# D$ ]$ u( [% m0 B3 r% o LDA $6010
% Z+ Q) W% Z) K# K7 Y5 r) u& I! U CMP #$04 ;关卡比较
5 J% T. H; [, p/ V) M* T# w% r BEQ PPU_NUM_WRITE
. W6 R8 u* ~# ~% Z+ E INC $6010 ;加关
) Y) g7 N* z, B0 YPPU_NUM_WRITE:
2 V7 Y/ S+ c5 p9 i LDA $6010' `6 k- j; ]4 V$ A& D, h5 | n& F; d( `
TAX5 R o: s4 D& t( r5 l" k$ ?
LDA STAGE_NUM,X ;写入数字! `3 e8 A& f/ B
STA $2007
. n- Y" I5 M, l4 n/ G8 `PPU_RTS:
3 p+ K, a. ^0 u" I PLA
$ K5 O" A0 Z. K1 ^ TAY! P/ e: Q$ A, Z
PLA; \& ~; x& ~2 a3 a' G
TAX) V3 v; t8 M* R0 T+ r% Z* r
PLA
% d' M& d. ]" t. `# @9 A RTS: ]5 l: f1 R- V
0 i& \6 i& k- z) i
" N& s/ C9 z G6 V$ f
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
0 }/ \1 b0 y" M7 b" ]9 ]4 j .BYTE $EC,$ED,$DA,$E0,$DE,00/ H, G* D4 v" J L
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据
4 m; Q8 r$ p0 I x+ g6 ] .BYTE $D1,$D2,$D3,$D4,$D54 U* L1 Q% `2 k9 p3 T
: U3 H0 i3 m0 r4 n. Q7 o3 B
PPU_ADDR_DATA:
: D# d2 P. i7 B' Y, p, [ c+ ^ .BYTE $23,$0C1 H7 w! w# h9 S1 }
( R3 T+ T: B i# n/ `! }
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|