|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 : C: u; k k* G1 n1 B6 X7 B" |
5 }! Q! h J" n' T得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.7 L6 m4 d6 ?& F: j6 ^
然而,今天想到一个思路.! l$ T0 K' N# K
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.9 s7 U3 q* a0 q. C: H* B& M
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
+ G) q$ v: ~& n" R1 o5 V3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF)." `" ^7 r. O: ~1 ], _3 E6 y) u
# J, x. \5 s6 N0 G1 C( \4 ~- q
" p- V% {' n$ l. H7 O$ m;[FC][最终任务KEY][END]
$ B/ s% `( U2 z( d9 O h/ u! rbutton = $04 ;单次按键
9 }: F. S/ K7 Q3 s$ e7 B) @flag = $6000 ;功能开关标志1 g5 V8 k% R. A0 K' ]/ s
pause = $000E ;暂停地址
, ]+ \7 `9 i2 h% s/ D: \+ z M9 L% d; k! @! ^
.ORG $8000
7 L |# R: V1 U! _# N$ a LDY #$08 ;自带的按键程序' ^. u7 e5 c1 M; Y. E* d
ADDR8002:
# T8 n+ o6 E$ c: W LDA $4016,X
1 d) i. R* w% J8 b$ [: v( { LSR
( s% K; D7 `( |3 k ROL $0021, }$ ]9 k' S$ V) W# b) Z
LSR
$ \7 z: x- a: w# G+ l& x7 J ROL $00290 @+ _) T- g5 C( d# A/ G
DEY
1 q3 { e. U, S, z1 B BNE $8002
. [) E5 c3 T( X+ p2 F LDA $0021
) O! [3 ^* i$ t4 I3 R ORA $00293 I6 c) `2 g9 Y/ D: o
STA $0021
5 n5 E( B! g5 b6 F8 v0 j# Q LDA $0020: @8 e3 b( D& A- ?* u3 n
AND $0021
. C- y2 S: A8 m9 n6 t STA $0020; l. ]; Z) L7 E, Q( `; D+ [
LDA $06,X
0 Y# F% ?, |" e5 |2 Q% \1 h. l. _ EOR $0020' C# z4 [/ Z6 }' Z0 J1 B) C
AND $00200 d% ?1 b, P6 Q( D
STA $04,X, A& `: |% q& T. Y
LDA $0020' N. g' t7 W/ D) a0 s' L% J( u
STA $06,X
' D& l5 l4 I( k+ U( W$ q2 b JSR KEY_OPERATE8 h- C4 D+ ]8 L& i
JSR Function ;功能调用0 w: } Y' z. q) u; p7 o& t: Q
JSR Weapon ;武器切换调用$ A! t3 C. r5 K5 N/ X& z
JSR Power ;威力调用 _: W& ]. ~) \& F7 Z
JSR BULLET_NUM ;子弹数目" [8 O9 H7 T4 ?' k( t
JSR BULLET ;副武器类型
6 l! P- U3 s8 l3 w4 D( `3 A( x+ {$ H RTS
: r. b! C w# @% \
0 G# B' a/ J, t- N" Y1 x+ \( [4 X+ O
, A( y/ d8 I* E, Q2 L8 w$ Q `+ A, I8 w! u5 t$ M* f- m
.ORG $8050( W) R& B4 W7 r- I" \) s
Function: ;功能
7 ~. U$ p8 E$ ?* n6 e1 dWUDI: ;无敌
" }: r5 {7 }9 t! I/ ~# C' a LDA $6000,X
5 c1 N8 L5 V! {( G AND #$08 ;开关判断
8 f7 n9 F1 A ]4 h2 b BEQ LIFE. W8 ]; s6 l! D/ `0 v4 M) h
LDA #$053 M! O/ F: a! {/ v% Z$ w
STA $05DC,X ;无敌锁定
. x+ P% S) g0 `8 c$ hLIFE: ;生命
) ~4 T4 c4 I+ ^' u/ L) t6 F9 z LDA $6000,X
( q% N+ g: y5 s! ^" R+ K AND #$04 ;开关判断9 s3 Q/ x8 Z( H- {$ _
BEQ FUNRTS
, U8 d9 x4 x* H6 n LDA #$05% i8 s+ p; t2 {2 C
STA $1C,X ;生命赋值' T: b9 \7 w$ p; @# \, M) c
FUNRTS:
' S" K, M# s1 [4 z1 w* G2 y RTS
) g% N7 c' d6 @1 S, |* `2 n % Y6 r; C, M0 }& m& V( O% v% B' M H
Weapon: ;武器切换/ L4 ~) s5 w: u6 z& V
LDA pause ;暂停状态判断0 |$ X- r3 f/ [0 N
BNE WEARTS
* {) Z- T8 A7 h8 u6 m% D. i: O LDA $04,X8 u' v& S1 A5 V: a
CMP #$20 ;选择键判断. h) |/ p; W1 g: Z% b* h% ], e
BNE WEARTS
( s4 D7 {) N/ g LDA $12,X
+ f4 K3 J/ R) U& ? CMP #$03 ;武器值判断
* ?3 |! z# f, O5 r6 N BCC WEAINC
' W {6 w% ~8 A0 h0 B, Z, k LDA #$FF: H6 S7 o8 s) @- I
STA $12,X ;武器重置
$ @% P2 ?6 Y- R* R, [1 @WEAINC:
) J+ d& \$ U$ r9 T$ k+ K+ Y2 ? INC $12,X ;武器增加9 B. R3 n% k' J1 i# p2 ?0 v
: [8 P# w- |; M& g
WEARTS:
% o7 t2 \: u* m$ ]" @; y5 S: L RTS# |" b" c6 p% _) i8 ~; l, Q/ c* B
- p4 A( @$ g) Z- n9 w
Power: ;威力% q# j% x( W5 I7 q9 \
LDA pause ;暂停状态判断1 k4 k' ^2 m9 D+ H0 U# ]/ n5 a
BEQ SPERTS- h' u& j3 o- Z
BUT_LEFT:
5 ?) o$ Q, }' I1 R; p& N. @& r LDA $04,X/ U) g5 Y0 W( s* K& ^
CMP #$02 ;左按键判断
) S8 V! v N/ `& `! r8 E5 S BNE BUT_RIGHT3 @9 u' \/ i) H' m
LDA $88,X1 Y2 U/ s( C! j5 `7 s
CMP #$00 ;威力判断
" b( t( e {7 }+ _3 V( e3 f1 i1 V BEQ SPERTS* {4 w# ~9 ]" b+ A6 s" v0 P4 f$ J$ t
SPEDEC2 i( `* a5 U" X/ C# U: m3 l
LDA $88,X ;读取武器值1 m9 B5 B8 m2 u
SEC6 z1 n+ l; Q: z2 t& z% _/ k
SBC #$08- L# z8 @5 t" i( Z; s6 _# G% Q5 B
STA $88,X ;威力减小
) o; N! I5 H, T; Y* r kBUT_RIGHT:
O% i, _+ d$ e. B LDA $04,X
" b; |2 T* _2 P( a5 s$ x CMP #$01 ;右按键判断
! x0 b: F4 l" B' O) o* t9 B BNE SPERTS: p# |. e" z# _/ ~
LDA $88,X
# K( {! I# [# W. \5 Q" P0 d CMP #$10 ;威力判断: e' m( U% W3 ~% p- l
BEQ SPERTS8 [( [" z5 o9 u% H: M# m" u
SPEINC:! m+ F g+ E4 S2 ?) Q3 g: d5 |
LDA $88,X ;读取武器值
1 @% u% X/ Q I# a1 C9 c: G7 t CLC
8 a+ Z2 u5 n2 G% _0 y ADC #$08
% S) \) w7 p$ p5 X& m1 b STA $88,X ;威力增大
3 j1 l( K- F7 g' a ; c) r2 [+ S; [2 O7 o3 M D
SPERTS:
& ^4 \* Q2 H" N& p& z7 C' t% w RTS
5 O: O% l) n/ G) z
- G6 B- Z- l& c4 lBULLET_NUM: ;子弹数目
% D" r4 K' F& h9 j* b LDA pause ;暂停状态判断
" X5 D* ~! ?; C# W. b4 n( P BEQ BULRTS5 z; m5 R2 c; `5 O
CPX #$00 ;主机玩家判断
* X+ k5 Z9 G$ u( P" j2 c BNE BULRTS
1 g/ [6 w: q( Q5 d7 H LDA $04,X ;主机玩家判断0 m/ I6 U$ i6 q. y3 V4 g
AND #$80 ;按键A比较
9 p! |0 u; ?3 |% D BEQ BULRTS
2 Z. M& n. M- a4 P LDA $87 ;状态判断
" c/ {9 \7 U) a BEQ BUL_29 G4 ^" i* m# v* y! X5 W
BUL_1:
, m m/ o( M6 c: ] LDA #$009 y8 }$ [5 O6 T8 w+ L% {
STA $87 ;1发子弹8 G2 P+ S* J/ U. ^ \ {
BEQ BULRTS' o5 ~- l# t* h$ R
BUL_2:
n9 W0 }% Y: T, T M$ i+ J LDA #$01' N6 ]! \5 k) D. D; ?1 ~
STA $87 ;2发子弹
$ f+ h0 `+ I2 i4 @
x4 T) }) L% {1 d" H; dBULRTS:7 D6 d' i8 x, ^: }7 I
RTS& E; d$ [% g: {8 N/ Q* C
3 G% V( {* v# e# g, I
+ E( ^/ ]+ {6 C' i! g* H0 b
BULLET:4 t! m; T, y. J$ Q0 m
LDA pause ;判断暂停状态
4 B8 S; e' R3 N& i4 r; O1 ^3 Z BEQ BULLETRTS
& _7 v( K: W4 C: l LDA $04,X
7 @ J4 i! W! R$ ^& O CMP #$40 ;按键B比较
5 {# c' F9 B( O, g7 Q, H BNE BULLETRTS. D+ F5 H( g; A& v+ q# m- Q2 T: @8 \1 m
LDA $6002,X ;读取副武器1 @+ M% l; Z9 c5 G* q
CMP #$03' m$ S) @2 s- S9 x
BCC BULLETADD6 f" X7 k- U% Z5 e, ?: d
LDA #$FF
( p7 G+ c( A1 i( o STA $6002,X
! z: t- U$ i- j% C; H$ ~( KBULLETADD:3 V3 W* d, b- v4 M' \
INC $6002,X/ _3 l7 {. t. c% s9 o4 F$ J
- H) Q3 d& `* S! Q0 T/ kBULLETRTS:4 ~( Q: B+ j' c7 q
LDA $6002,X# D! q1 x0 }. q$ ~( l
TAY! D+ y0 Q4 c% e3 j1 y$ Y4 [2 B
LDA BULLET_DATA,Y
; Q: l: f, l, `! f- \% F STA $6004,X ;写入副武器数据
( d. w( o3 L. m+ O0 n, m# s RTS5 ]1 u/ Y: ?! E; X2 W; L( y
m8 u: ]. B$ x 9 R; v4 Y; C" h; g) F
BULLET_DATA:
; n& b6 [3 ~( w H2 |8 Q .BYTE $06,$02,$03,$04
3 P5 [" N% @) q$ H/ i6 Q
7 D$ E( J6 J% b2 L( w2 F
; X% Z7 t+ B" k7 C5 P+ J
" r9 ?+ d7 X; s% Q( }KEY_OPERATE: ;按键开关操作4 y, `8 T+ Q5 Z* Z. N
data_protect: ;数据保护" N0 j. z9 c; i2 N
PHA4 J& ?! ?2 q8 Y! a% n( C" C
TXA
% `( d' g2 o6 \5 K. n+ v PHA
2 |& f: a8 X9 s# h# V1 B: S TYA
% z g; \& X! n7 G PHA
. _2 d) J1 N& |/ _9 m- N
8 O" T8 F. n( k" ~% R% n' QFLAG_INI: ;开关标志初始化
: C+ v2 D- G+ a1 V. o5 R
$ C! c2 s3 K+ X: Y! O. ] LDA $600F2 x( _9 d$ l: L! u
CMP #$01% V g8 m R8 {$ Y- q
BEQ pause_cmp3 K, `1 N7 ?9 U. A
LDA #$002 o( N3 j+ i. G3 ^0 e' b; i( z/ x
STA $6000& }0 z7 V) @0 y9 |/ F* b* X# ?. ~
STA $60010 w8 X# s6 z4 A, W% t# [* s, ^0 c, A
STA $60025 C+ x+ B9 P# N6 c; X) y2 N
STA $6003$ b+ F3 j( Q! G9 ?
STA $6004
) V, n3 b$ i" O* P+ o& N, P, } STA $6005
0 k( S% c; d2 W: v. I: S. d LDA #$01, Z: g; {7 h/ T
STA $600F m2 U0 K* h, @4 V
- N( D! S5 ?5 Z9 _! x
pause_cmp: ;判断暂停状态' k4 ?: w" l* l, K3 d5 }
LDA pause7 O0 o5 @' f: C+ ]. y
CMP #$01 ;判断暂停状态 F& T# z/ \7 b' V T7 R6 N3 J
BEQ button_press( P) B! P/ N7 k6 T, t) [
PLA, T! y' o# j. i0 s9 x4 J
TAY, t6 |+ F6 \6 J& W
PLA
4 _, n& ?8 {- c3 h6 D9 g TAX# h) r5 W2 q" r# R, `3 n
PLA8 z7 P+ g, T0 o% `+ s W
RTS
+ N+ ?! Q) j3 y' p; A; t! ~8 R' @
5 b* H; ?0 p. a; Wbutton_press: ;按压操作
' `+ h' Y! x8 e! k0 lini_Y:8 q3 _" n; c. l/ Q' a1 b5 e2 u
LDY #$002 f9 T( T5 p" }3 q" ^2 {0 ^
button_cmp:
! Z9 I" J( S7 l R) D LDA button,X
- c. {/ ]& c9 f0 I( Z6 R) S* t# d( g CMP ora_data,Y, d. W; z5 t/ w! }/ X+ o' M
BNE count_Y_cmp! q% N4 r6 X9 s
flag_cmp:( N2 [: {/ U3 k/ e/ s) e8 r( J8 Z4 o
LDA flag,X
7 k- j: P n; V" }: i3 H AND ora_data,Y
- i1 X* S# u$ q/ c BNE flag_and
. Z9 | _1 L/ \' uflag_ora:
2 y( d3 Y- t; X( f6 U/ m5 F LDA flag,X+ E7 K, ~5 ?5 k
ORA ora_data,Y0 w# R9 @% [. e$ ?+ b. j* ^2 X/ u% ^
STA flag,X
6 S3 x. ~0 l7 x BNE count_Y_cmp7 u1 o2 M0 h- y2 b0 l* c" ~' C
flag_and:. m* B, j! z" s1 F' v
LDA flag,X9 e( e5 K/ z6 R/ F! G% T v% P% I
AND and_data,Y
) R0 p3 a# V+ E) L# ~+ o* F& O STA flag,X+ j- l2 E, w! d. x) @1 R+ [
count_Y_cmp:
# X# m# U$ Z+ C7 } \3 A INY
9 l, S! g" e/ p/ C* L8 A% o( h CPY #$085 U } i& G6 I) h9 q- X* v
BCC button_cmp" Q' z1 Q; {/ D0 V" n. m+ ^
* {" o" m9 P% w1 ndata_extract: ;数据恢复
5 _3 y- O: e9 S8 P& H! _2 i# B PLA
9 M7 d1 X. a" |! p. h) ~0 Q! g TAY
; F, N R% q- z4 C; P; \# X9 s PLA8 k% a; j8 m( z+ a3 ]" K& J7 Q- ^1 ~
TAX! {7 I; U& n4 G1 `! N- l
PLA
& r& p; X1 A; o7 u; W/ m( ~+ J7 I
l$ V- O# F) p# Ereturn:; k- }3 G% y7 z& r
RTS
4 V7 h% p2 Q+ u- G" @: v
3 \& U3 T1 j: {9 F* Iora_data: ;按键相或数据
U2 @; v- ] F0 I .BYTE $08,$04,$02,$01,$80,$40,$20,$10
& F n/ h- f' [9 N4 r$ O, D* t& N8 Xand_data: ;按键相与数据2 A, R" x k4 |! Z1 z0 K2 Y K
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
$ G: S$ `+ j$ h2 ~ " a R. O# Y3 N
5 I; g5 c- _4 G4 V+ }/ I
3 ]( g5 A1 C1 `' N ;FC数据搬移程序 BY FlameCyclone
. H4 K% q. Q5 u .ORG $8200! O8 [9 R5 Z# s* u: g% Y/ p2 v
JMP DATA_COPY_PROTECT2 I! h$ z3 U7 z# F3 Y: e) k7 r
2 a% k' o5 f- ]' v F% x/ m4 PADDR_DATA_TO = $40 ;目的地址
3 r" k: k! k) y: ~ADDR_FROM_START = $42 ;源开始地址: q% Z6 E, B6 ^ j/ ^1 {
ADDR_FROM_END = $44 ;源结束地址
: G. T, c& K3 t# K* o# s5 j! A( ?& `, R) c2 Y b
ADDR_TO: ;目的地址
; w, O4 p& t0 d .BYTE $00,$70% g' Z. f! F, H3 B1 I! M$ l) r- R9 Z
ADDR_BEGIN: ;源开始地址
* o$ u- ^5 S2 w g- p2 s) A1 b D .BYTE $00,$831 B: X: W) P1 J+ v( g
ADDR_END: ;源结束地址4 x. F z3 R, c; j! Y6 t2 t# e
.BYTE $FE,$849 q8 t, u- w. ^6 h* u
' t! o# f( f* P) U QINT_ADDR = $08 ;中断地址
) M" E! Y0 T* R* }7 S& v3 I, GFLAG_OVER = $71FF ;完成标志
! w0 |, z/ i: x3 C+ V; @
+ S( E$ v6 S5 R# H; }4 E# |# O" x+ O$ Z7 |* M
DATA_COPY_PROTECT: ;保护数据: ~. v3 \+ H1 i
PHP
! D3 j1 z: @2 U9 K PHA$ I- i+ r7 k c! b* J& {
TXA6 s2 Y/ w% K$ J& ^2 O
PHA4 E" }# U6 v/ k- W$ A' Q
TYA
6 @8 n% A( F9 j PHA
) i4 L6 r* F4 c LDA ADDR_DATA_TO
- X( z1 s7 D b3 _6 ^- F PHA
, U" e7 k. Q9 O1 O" k LDA ADDR_DATA_TO+1
' W% M& s C2 B2 A) ? PHA
4 O5 }3 X8 _, D. Y# { LDA ADDR_FROM_START
% I+ ]2 }7 ~$ P( ?" d3 F5 T% w) [ PHA: D+ S/ S& N, H# v# L
LDA ADDR_FROM_START+1
& h4 t% h- p. Q! a8 ?& s0 u, g PHA" v4 o5 q6 B+ u1 ~4 M( W( a
LDA ADDR_FROM_END. B, @! L5 E% F# C
PHA
" J9 B- O' \2 ?/ m9 q- H LDA ADDR_FROM_END+1
8 _% d) T* s% B3 q: J PHA
8 U7 G% s+ _" j6 J; f3 y8 Y" c " n$ z" F1 e- u. X1 g
OFF_INT: ;屏蔽中断
' @: M( K" X( x; f& F LDA INT_ADDR+ \0 _5 ]5 E! ~6 }
AND #$7F
. s& V: d! Z% D/ i# X STA $2000 ;屏蔽中断
' W+ y1 F- \% L* `8 U( f: C8 [. A% L4 \7 ^) J
. O. F ^$ k' X* w- @
SET_DATA_ADDR_START: ;设置复制起始地址
7 Q; ~" c) t4 [6 j: w5 Z( k LDA ADDR_BEGIN+ \: s4 u5 e* j. p. B
STA ADDR_FROM_START ;设置复制起始地址低位- a9 ^" H5 `% h7 ?0 W( k5 K
LDA ADDR_BEGIN+1
6 c) B6 x, H' N( o+ a8 s. x STA ADDR_FROM_START+1 ;设置复制起始地址高位; G/ W" t, m& @( t# t
- w" v( ^& k% ]% Y. n) @SET_DATA_ADDR_END: ;设置复制结束地址' k3 |2 y4 C, D6 H
LDA ADDR_END
% m: L. y" w+ j1 c4 ?2 F STA ADDR_FROM_END ;设置复制结束地址低位+ I1 d7 r9 ^5 x
LDA ADDR_END+1
9 n# s* b. X; K3 Q& k, J STA ADDR_FROM_END+1 ;设置复制结束地址高位
/ R. a! K; [. f; c; m" g
( x" r9 B$ A: `$ jSET_DATA_COPY_START: ;设置目的起始地址+ G% \$ U' Y+ Y: @! n0 K( k
LDA ADDR_TO0 K `0 B/ ?2 P
STA ADDR_DATA_TO ;设置目的起始地址低位
9 ]/ y- Q$ }! i: j4 I4 [/ s LDA ADDR_TO+1
& _4 _" q7 e# C7 M STA ADDR_DATA_TO+1 ;设置目的起始地址高位
6 C4 ?/ Z! l3 _4 t5 p* X 1 k1 U$ \7 X$ ]% _
OVER_COPY_CMP: ;复制完成比较7 \6 [4 a( r1 d5 i' y
LDA FLAG_OVER6 Q" M h* {' M v& S& i
CMP #$FE ;复制完成标志比较
7 k) H4 I7 R2 m& I4 o BEQ DATA_COPY_EXACT2 |1 @. A! v, L, N4 P1 }
; U |( ?- o9 u: i; ]INI_XY_COUNT: ;计数器初始化
4 _0 p& Z1 I# _ c& V3 U# q LDX #$002 i% s3 B1 d! t0 ~: L6 a
LDY #$00# T/ H+ X6 `# ?* T( G& m7 [( e& z
" l1 R+ T, I/ MCOPY_OVER_CMP: ;地址比较1 V* Q; a. o }( H% I
LDA ADDR_FROM_START' L3 D: I5 d0 d+ m- a( T( _
CMP ADDR_FROM_END$ c9 r) P7 M( W9 V* O1 x
BNE COPY_START
, e8 \% X* c: ?! Q! } LDA ADDR_FROM_START+1
- Q7 K0 W7 l1 R CMP ADDR_FROM_END+13 O; h8 S+ U' `5 o' W/ Z
BEQ COPY_OVER- c$ ]" ^. @" T$ U( O u
8 `/ I$ |4 I6 m0 ?
COPY_START: ;数据复制开始
$ ?* u1 ^$ O" Y LDA (ADDR_FROM_START),Y ;读取源地址
7 b' F$ d' A0 I4 R/ v& Y STA (ADDR_DATA_TO),Y ;写入目的地址, ]$ O' b3 Q5 \$ W$ I
INC ADDR_FROM_START ;源地址低位递增
# v; Q$ f7 D5 B9 k INC ADDR_DATA_TO ;目的地址低位递增0 ?2 R) X1 ^7 X7 u8 ~! D& Y
BNE COPY_JMP
( C* d: I( P1 `- {* R3 ]5 Z- o INC ADDR_FROM_START+1 ;源地址高位递增9 Z( r6 `1 E3 n3 L7 V
INC ADDR_DATA_TO+1 ;目的地址高位递增" q# E/ C9 A. p# C3 t# f5 N4 R
% V8 f. W0 z9 ACOPY_JMP:
: K: o: @6 @) w JMP COPY_OVER_CMP9 L( v2 d( D1 r3 A
[4 v, N8 c* b$ R1 `+ J
COPY_OVER: ;复制完成9 I: [8 h$ J* E; q
LDA #$FE" _& V0 o- D8 ~& Q6 }) }
STA FLAG_OVER ;写入完成标志
, @3 P+ A7 ^. [, h! u8 E9 V) BFINAL_BYTE:
: k5 z8 S% z3 ~4 L/ E- i LDA (ADDR_FROM_START),Y ;读取最后一个字节" \; C7 m% J8 Y I1 z) O; d
STA (ADDR_DATA_TO),Y ;写入最后一个字节
- d! {9 g& j0 z. J6 s
0 Q2 R- F) S, kDATA_COPY_EXACT: ;恢复数据
0 Z! ~3 i! `7 I$ {1 k* T LDA INT_ADDR r) f! W* h& I# q1 H6 t9 F/ h
STA $2000 ;恢复中断& ` N) I' b) Z) m* Z* f6 r
PLA
5 o2 L; Q# u: _ STA ADDR_FROM_END+1: U: d$ t0 z4 G# C+ P/ }, V5 _
PLA
# L0 R4 O% ?+ M3 b STA ADDR_FROM_END
# r$ m2 {8 k H, X+ M% y/ c& u PLA2 k9 j: B+ ~% i, p
STA ADDR_FROM_START+1
3 `7 W' |: I) S+ T5 N PLA
' Y+ h B* K) Q. F STA ADDR_FROM_START
0 c. q* @- W" D4 F: l PLA
8 k' q# o2 `- X/ L3 J% `2 i( q STA ADDR_DATA_TO+1
6 U A: e0 K( v* z$ y b PLA H9 K& s& V" y3 ^
STA ADDR_DATA_TO
- p- g* l% h6 y6 o PLA! p& n r6 O, K& @' d- J
TAY4 U8 R q- Y q1 U
PLA
7 g4 p2 {/ b1 D0 U# m TAX% F7 V x( H. q; e! H
PLA
: V0 H! Z# ^6 t8 ]3 e3 R! I PLP! c4 V8 J+ ?) v, R- b
& ]1 y, n3 S p, i 6 w$ |) F0 j- l) C
2 J+ }; q0 V @2 C- y% z
DATA_COPY_RETURN:
! ^4 n: e8 A. M8 ?/ ^ RTS
' c0 m- ^6 x5 A1 e0 {1 d
6 j3 k: C" ?0 ]6 X D .ORG $C056 ;精灵指令覆盖: G8 } v, @5 I2 f5 J4 v
JSR $FFB5 Q( a/ s7 A) C1 }( K& L8 p
/ Q0 P8 ?9 P/ N: ~% w9 d) q
.ORG $FFB5 ;, y8 q2 ~/ C2 r* V, m2 M; G
PHA0 c! H8 @+ u! A, A2 p( A. I
TXA) K4 g6 o4 I; G
PHA
+ @5 b! ^, t. A- F4 f TYA
9 k; ]+ N+ m( h2 [ PHA
Q* \% d8 B3 m, V7 K Q* ? LDA $71FF ;比较7000-71FE数据是否完成复制1 n' C5 \' y# |" N3 U2 t
CMP #$FE4 n2 @" w! @! J5 \! j5 s R
BNE ADDR_FFCA
$ P7 f8 w7 H' H, d% O PLA
$ p: Z# a. L; {5 {" k8 |& G% A0 T$ Q" { TAY# c. B7 x5 n5 H) {) X' V! K; \2 l
PLA
% w v1 B8 k6 F& N9 @* d; x6 r5 j TAX' \9 }& n$ p3 a
PLA7 `2 ?; v; n! w. ~
JSR $7000 ;跳转到自写程序( o3 M5 K! L8 @" q
RTS
) u" b& }# R( o' \5 KADDR_FFCA:
8 n) t6 X2 g6 W PLA( G% |, i# N+ {+ l; W' |3 ]. c: \: B
TAY0 b$ U1 `: w9 p
PLA9 a2 o7 d# ?& ]
TAX
* c6 |7 K1 j/ `: Q PLA$ h- V+ u+ \+ |5 }
RTS
( D/ n2 ?% S. \; Z7 o. n- C3 { a; C9 f
1 P2 E2 w, f3 D9 `5 \0 i" i5 _
.ORG $C264 ;自定义的MAPPER2切页程序. e9 {3 y7 Y+ x2 d" p
PHA4 M2 s' N' K% V5 \
TXA7 t) H; F! [: W1 w( y' [) \
PHA: ^$ n- L4 s6 p! K0 Q. O. w
LDA $0066
7 X4 o5 u# G6 Q BNE ADDRC2805 K# G+ c1 ~2 W# P
LDA #$07
/ f( e9 }! x8 _! u& z+ P8 U) k LDX #$03 H$ r- Z2 ^- d( M/ h( B
JSR $CD9B ;自带的切bank方法+ ~6 _' p0 S# T6 |) `
PLA
. V p1 {/ E! z0 R, N* ?; Q, ?2 V TAX
, K% B% T" b' ?. L/ |7 f/ n PLA
' |6 _3 ^: _$ k3 v0 D7 z JSR $80001 y# b$ I0 d6 v/ b
LDA #$061 x% ~$ b! p4 G2 J2 V$ s- a
LDX #$03* C; X& ~2 z; h1 m, W1 r
JSR $CD9B ;切回原该切得bank(可以不用)
1 k7 N, Z2 f5 Z+ c/ C; ^ RTS
# L9 C: H, ]3 s6 GADDRC280:8 x6 s6 p6 @* {( B. w+ n7 T# r% I
PLA0 g9 P7 K+ B5 B. n3 |, @, d
TAX
g5 R( G6 W7 s, ]' P- d: u' Q" N PLA6 g4 J' M" k D8 t5 V/ Y4 i4 Q
RTS% Q/ q% e$ {$ U3 d9 b2 N6 d; o. Y
" z3 _( W: e' y0 U
4 E5 K( Y. L c/ _7 J9 u;[FC][最终任务PPU][END]
1 z9 ` z+ G; X: l9 x .ORG $C056 ;跳转到PPU重写程序4 j* r) C @% E# Z+ F
JSR $7000) ?" v0 d& B+ c5 X8 p
# Q" v' Z3 r- k; P% e1 y% }3 H .ORG $CEBF
: ~4 Y7 M! y0 c' @. a) t) S; u1 E1 o JSR STAGE_DATA_WRITE ;跳转到关卡数据写入# U7 A5 K$ P! n
% `& D, E) g+ b. N7 B, K6 p, k# F .ORG $E460* I* ~; |% ^- b3 n: s) x9 o
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
3 [8 T5 |% n, M9 c
1 F; [2 H3 A2 ?9 g .ORG $71F02 | p- {) Q: I! ^
STAGE_DATA_WRITE:
$ W2 R% E" u R2 F% A- n8 e LDA $6010
( a: k3 {3 G1 C9 M' u. n STA $1E ;关卡写入
3 W8 }" D4 K$ }& S. {6 I7 w LDA #$00
" G7 z, r8 H- m# b RTS8 h; O8 @& V* _
.ORG $71C0
' b3 Q7 Z0 r3 [8 Z1 FBULLET_DATA_WRITE: ;副武器数据写入
, j7 B# s2 N, |: j* H1 C4 ^, v CPX #$0E
5 ^9 O" V1 G1 x% U5 | BCS P2_BUL* { W, E7 W* O. n) |0 s9 M! e+ r h
P1_BUL:
4 J1 ~9 c3 h9 t4 ]+ \" [2 k LDA $6004
" p+ O8 D$ X4 c# k& e JSR $D7D0 ;P1副武器数据写入
* b4 L4 B2 ^" \/ F# N RTS
6 s3 Q% N, X" [. r& ^/ Q _P2_BUL:
2 @% o5 E. y* L4 L" u# Z+ i LDA $60058 R- g" S. V2 M0 r2 g
JSR $D7D0 ;P2副武器数据写入3 d5 W9 |7 P# d
RTS# z1 n9 X" f0 b9 s4 p
' ^5 M! p( c B5 v
( U4 \ s: J' m' `) h# t0 n .ORG $7000
1 ~; u7 t5 E3 F
}6 T; v; [" Z STY $4014 ;补上覆盖的精灵写入指令 N- h5 ]: |$ Q+ J
PHA& F5 w3 X2 o, g1 y. T4 v6 Q
TXA( Q( `. z; B7 G2 R1 M
PHA/ o# p l$ A/ ~. F" v: U9 X+ O
TYA
- T1 T$ i% V9 l/ @. P! f& U PHA
' K4 n6 y4 G G: o m9 P3 T" f LDA $0C2 x. O8 a# W% _4 `4 W
CMP #$01 ;比较是否为标题画面- c2 T$ I# x. F& n* l
BEQ PPU_STAGE
3 U% Z; F H( \. l- ] PLA
7 ?1 _5 q b: T( F8 V" u TAY) ~8 [. L3 y. p2 E5 I: F# ?. \) [/ L
PLA5 P% u5 w+ s7 t( p. `, E F1 t
TAX1 D6 v0 V! X3 [9 Z" l
PLA
* E1 K& R" q y+ A5 A: @" \7 | RTS
. t: J# ]& }- A" u# J( j2 ] {: LPPU_STAGE: ;STAGE显示程序6 y7 F: w8 Z- Y5 W
LDA PPU_ADDR_DATA
3 L1 d0 F. M2 }4 V STA $2006$ N3 u) C9 L$ T4 h8 M: x2 Z7 {. O6 D o
LDA PPU_ADDR_DATA+11 h B: n- T; z5 T) f& m
STA $2006 ;坐标设置
3 m8 p) a5 B% n LDX #$00
& I8 c/ i$ T' \6 u# {/ ZPPU_STAGE_WROTE: ;写入STAGE字模* o# c. E8 G S' b
LDA STAGE_DATA,X. j0 n J0 s3 z/ K7 M
STA $20075 x" u2 ], _% R, ~8 a H1 x
INX, { t; M! F* W# R
CPX #$062 s! A& w6 T* M$ r# `
BCC PPU_STAGE_WROTE5 n4 |& n" s; d7 |% O, e5 |4 _
LDA $60106 b" G. S' V; X+ l5 s
CMP #$FF ;关卡数据初始化条件判断
2 ~0 b' t2 D- h4 q BNE KEY_B! Z4 h6 Y. _/ ^, [
LDA #$00
! \" F a( I" m0 Z0 O STA $6010 ;关卡数据初始化: N- X/ O* `1 ?4 U k8 g/ v4 z; Z
KEY_B: ;关卡减少8 ]' {9 b/ R6 H4 @/ U
LDA $04: ~/ w3 X( n8 H3 r
AND #$42 ;按键B或左减关2 U/ J" B* A4 Y: _6 I
BEQ KEY_A
& h( E3 C/ l" D9 G w LDA $6010; |8 t- u! d _ _. L1 N0 \
CMP #$00 ;关卡比较
( C6 r8 W: P( d \9 S BEQ KEY_A
& ?2 K; g- U# h1 ]5 t, T6 } DEC $6010 ;减关" \: V) t/ Z7 V' h5 h
KEY_A: ;关卡增加8 d y4 C- {, D( I: G8 H
LDA $04
( u0 ^2 f, q- H6 X& @4 Q# y AND #$81 ;按键A或右加关
6 H0 b5 } Y' a BEQ PPU_NUM_WRITE
# a7 P* X- b# j LDA $6010: b5 Z! b6 V! ?! v3 |; C
CMP #$04 ;关卡比较" Q7 c- F( t' s# o& v
BEQ PPU_NUM_WRITE
) R) w! K" w* P$ \& `- h: t! { INC $6010 ;加关
* r* L$ L3 D7 P, hPPU_NUM_WRITE:1 A. O! m) M& a/ h- |# j& h$ _- e
LDA $6010* D( U$ S* b% ~) c1 r
TAX( }) Y. x# E# N
LDA STAGE_NUM,X ;写入数字3 A. f: u" M4 n2 D, P# p5 O9 E
STA $2007
6 o$ @6 x' v" mPPU_RTS:
" R- D, ]1 l9 z3 S! Y PLA
- ]! O3 Z( O, p' c+ i$ e1 z+ r TAY' p) [% }- J3 n# n$ G
PLA
2 w6 w' S9 [! x( C' s9 \/ @ TAX1 I2 R" M, L2 |
PLA' z7 B! L) y+ A- J7 p, W. m
RTS
. J0 w8 D1 ^9 M( c2 X ; x5 @" u+ a3 d6 O0 j3 U
: f; v" G2 M/ P [ Z M: i4 _ ^
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
4 s" S6 ~% j' |0 w" ?( W6 P: }: W .BYTE $EC,$ED,$DA,$E0,$DE,00
- v2 G! [5 p& gSTAGE_NUM: ;关卡数字1,2,3,4,5字模数据, R% x, o( _) f, S/ x: @
.BYTE $D1,$D2,$D3,$D4,$D5
. P$ G* M4 r0 h) M1 ~3 [
% n9 a6 C: J) s- I8 ZPPU_ADDR_DATA:4 z- r$ Y5 ]! i: R- e' _9 b8 E! ?
.BYTE $23,$0C3 j9 ?+ x; i: N6 `) v1 p
, D' d4 U) g$ `) J
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|