|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
% V# g. W% r' W p U1 B
7 r q6 H0 U9 i, }- d2 n# x. W得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
8 O9 o4 H4 B8 U. [然而,今天想到一个思路.: ^; X0 s1 @+ S7 M3 i
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.- l- G7 U( x# v8 `7 _" ~2 M: W
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE9 I2 z9 k, _! u: k, i
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
. S4 z# E, Q+ {
9 F4 u* G5 s9 K" P4 c
; q) S1 B _: D, O- ?;[FC][最终任务KEY][END]
, t$ u9 O1 X" A% f }9 G Cbutton = $04 ;单次按键. \* z" X' k# g! U# j, }
flag = $6000 ;功能开关标志8 `: c3 o8 F9 R8 m s( b
pause = $000E ;暂停地址$ i2 H- }- \2 X" {3 E7 V3 A0 B
8 L( v, l6 a l% _' `8 G .ORG $8000, `. M6 m; i* u$ q$ _+ l$ t
LDY #$08 ;自带的按键程序6 L; _2 W! _5 g/ H2 C
ADDR8002:0 ?& z( x5 ^6 p8 ^+ N
LDA $4016,X
. B; o$ j0 H; x; {! V LSR
" Q! |' ~0 u$ Z# k; j+ b ROL $00214 I* l/ \2 N+ Q, X' z
LSR% j! g9 W/ Y5 U0 Z9 E! `
ROL $00298 Q& Z1 }8 A, d# Y4 M0 m" N9 `
DEY
: G5 \8 p$ h4 L6 q( Q0 X6 l5 i) b BNE $8002/ u6 ^' @+ R I) r0 X- o3 {& M! i3 k1 Y
LDA $0021: G* l; \! G' z) m. I
ORA $0029
5 c' v1 m# w; u5 ~ STA $0021+ b0 i& }1 c: B# l7 _4 O! j' |3 h: z
LDA $0020+ U/ I" p3 x; @3 V0 D4 [8 O
AND $0021
3 K" ~" b+ N; z: I# ]/ ~ STA $0020' u# W. k3 x+ |$ D1 W t3 ?
LDA $06,X
3 Z0 E4 ], l8 i1 v EOR $0020
1 [0 N4 J' a. ]. U1 }- | AND $0020% h) _- A& C: ]( f9 |
STA $04,X
) J" |5 u0 f! j0 ~" G, d LDA $0020
# ~6 ~# h) T2 H; b, J STA $06,X' ]( N7 V2 }0 }
JSR KEY_OPERATE2 o! l" I# B1 C' ^4 c
JSR Function ;功能调用
( S: V% x1 F$ ?* O# C JSR Weapon ;武器切换调用* N6 S9 F2 y6 G) t2 D% }
JSR Power ;威力调用
! l! g b* T: V- O5 l JSR BULLET_NUM ;子弹数目
# g0 p+ J- m# @$ E JSR BULLET ;副武器类型
: N* |# [0 ~& g RTS6 H9 s/ p# M/ k9 f- v( K( J) T+ O/ N
* v2 m+ s% Z/ c
5 b* v, R, Z# `% a8 c0 P% h) `& z' J
" x$ s- R6 i0 g2 d" X: T) O
.ORG $8050( c: _% b' O R4 N( V4 ]$ j
Function: ;功能3 t5 K( N+ ~/ \( a/ [6 n
WUDI: ;无敌. @7 f. W: ]' ~* x, G1 ?
LDA $6000,X
( j9 m5 l' x+ N2 T2 ^- r AND #$08 ;开关判断+ [, P: Z' K" S& R1 W
BEQ LIFE5 y" P$ c0 I8 A5 P7 ]
LDA #$05 T$ y3 `% u l* @0 w1 H0 M
STA $05DC,X ;无敌锁定/ V$ A: e6 y W
LIFE: ;生命
+ h) }9 x* H- }( A0 u w9 i# {5 K LDA $6000,X6 j1 o8 x g( G+ T' \( z2 A) n
AND #$04 ;开关判断7 O& B0 }# i+ h. E4 W6 V: B
BEQ FUNRTS4 D P( T/ e* Y! D$ |
LDA #$05! t5 O/ d" E0 K+ h& r
STA $1C,X ;生命赋值
6 {2 }3 b0 b2 b/ GFUNRTS:
1 i/ N0 f6 u3 s+ _5 w9 B5 Y RTS S6 s) p/ T, m5 k8 j7 b: R
+ ?1 e$ w) L( z8 g/ A, |" }# Z
Weapon: ;武器切换
( M: [6 e& d: ]4 r0 [1 b* \ LDA pause ;暂停状态判断; P$ g( T' m8 w) t
BNE WEARTS: |1 R+ n9 e2 o7 y% D! U
LDA $04,X
6 H* h: W" P" |2 k CMP #$20 ;选择键判断
% O( T: \4 z( ]6 d5 \) f) V BNE WEARTS) h. {* k% n8 [& \4 X! R2 r
LDA $12,X8 p+ Y. J( H+ l& Z3 h6 s
CMP #$03 ;武器值判断
+ w$ R3 R) T. t% ]0 n BCC WEAINC' b: v1 e; C/ O, e) C. {
LDA #$FF4 I. b0 z2 w8 @- f% d* ^9 ~: y( r
STA $12,X ;武器重置0 ?! K; c& i8 T$ K& w- r* @: A
WEAINC:3 C1 A8 D% i# {( J9 l
INC $12,X ;武器增加( o3 n% H+ J" \! l
0 X( t, A5 ^6 U, iWEARTS:
, N& M/ \5 W& h& ~) O% Z RTS- z2 I/ Y$ U/ J; x' u9 ]
* B! d( V% ` C$ }Power: ;威力
7 D. Z$ k/ S8 \! I( C LDA pause ;暂停状态判断
. }: S! H7 o$ j4 t6 X BEQ SPERTS
7 q. L0 L5 g, i h% iBUT_LEFT:# G; _5 p; m j7 x1 H# v, ]
LDA $04,X2 U: n+ d9 Q! C) K1 }
CMP #$02 ;左按键判断# m* x0 H, B( F* |) z/ o0 `# I
BNE BUT_RIGHT
m' ^ Q1 e2 v1 x( K$ L LDA $88,X% }0 \1 c+ S3 J( e
CMP #$00 ;威力判断
- m; b4 m6 g' L% o h BEQ SPERTS1 U% T2 w( C+ s9 F5 ?3 D
SPEDEC
; ? E( K9 M2 g% v/ Z7 _/ b( Z& F LDA $88,X ;读取武器值: q& j1 W& z& l
SEC
" G2 J$ w( D4 @* F7 H SBC #$08, J [- j2 Q! T6 P1 P: D
STA $88,X ;威力减小0 x0 x) k' c( ^& c* _' v: `
BUT_RIGHT:
7 t' t! m, U" d, F3 n! T/ p5 E) z% ^ LDA $04,X
* [# P% Q' U' k, M) ] CMP #$01 ;右按键判断5 W/ S% s+ b2 a/ U; k
BNE SPERTS# | {& h1 ?5 q' N) E3 _5 k+ \+ i
LDA $88,X
1 {+ Y7 l2 P! o" Q# |- d4 t CMP #$10 ;威力判断' r, f* Q! A! w. n% j6 W
BEQ SPERTS
' X7 Z; i- k4 O" i4 {SPEINC:
4 Z# p1 o! M8 a# a* b LDA $88,X ;读取武器值- t: G; Q3 b8 ^' v! p+ G$ @" u: D
CLC
8 u2 L5 c7 l& z |* F* p1 r ADC #$08
- Z! _0 V, p0 r9 I STA $88,X ;威力增大9 H$ ~$ w7 {" a# h/ F
8 E1 U2 P! B% ^" t% q* z) l7 z' FSPERTS:
% Z6 J9 k' {' f! f$ m+ T8 O% K RTS; y1 n G) e3 L( {7 |, Y! g
" V1 O! ^" }- h4 n$ [' p
BULLET_NUM: ;子弹数目
0 s& Z5 U7 l0 v% _$ V% G9 ~ LDA pause ;暂停状态判断
' _, z! i( w: q! [ BEQ BULRTS5 O$ \ Z9 y5 c3 g6 W5 @
CPX #$00 ;主机玩家判断- }+ ? s0 B3 l% t
BNE BULRTS, y6 e" o4 [+ S. F. j N: \" G% g
LDA $04,X ;主机玩家判断3 G$ [3 E- u& {! V- T6 d* Z/ E
AND #$80 ;按键A比较
4 Y0 K$ p2 j% c0 L7 W* { BEQ BULRTS6 n% O% }4 {2 M. G2 d/ R# q5 K
LDA $87 ;状态判断
7 Z6 y) s; N% ^+ V+ v+ B- j+ @ L BEQ BUL_2
- f4 { I7 g6 Q+ x9 H4 wBUL_1:
# G5 _. H# a& x# ^. a LDA #$002 D% g5 Q- Q+ [5 G3 I; s
STA $87 ;1发子弹2 H4 p0 m6 w( T. R% f( v
BEQ BULRTS
# a/ E, O4 | U, I- t% rBUL_2:3 v9 i/ l8 _4 C6 p6 X
LDA #$01
" j8 t! p6 b% y; h% m STA $87 ;2发子弹- ~+ L& B& I4 T5 M/ x
' c G9 m) ]5 lBULRTS:7 n6 w% @) ]& g
RTS5 Z, u% v+ Q# Q0 |; V P% P
8 V7 Q1 Y, A5 A) J2 P
' o* C& x; l) {( R* V6 z1 k
BULLET:) v, j/ ^: Y: n1 ~7 J
LDA pause ;判断暂停状态; b2 w/ F3 j( |+ v( }
BEQ BULLETRTS
4 E3 m: g$ g/ _ LDA $04,X' ] s: ]4 C' p; r, ~6 z! }+ e# y' N' [
CMP #$40 ;按键B比较
, y: b2 Z, g! s: \ BNE BULLETRTS/ ?& [* [9 W3 Y; E
LDA $6002,X ;读取副武器0 q' @% S, Y1 ?% l% ~" E H% U( l
CMP #$03
, f# q; |( ]2 C1 Y, q! ` BCC BULLETADD
4 o4 G+ d" {3 u8 G) B3 _ LDA #$FF
8 W V5 T4 y9 I1 K7 O STA $6002,X
9 d! g m% @2 s2 `* cBULLETADD:
" w2 c0 S. x9 }3 X* D INC $6002,X
$ T& r1 C$ ~! w + L1 L: P# \5 L2 `0 u
BULLETRTS:
$ S ]. ]! F8 L' d3 ]8 B8 f: N LDA $6002,X
; Z- R' K6 Y8 n9 T8 I TAY
7 t& T/ l/ g$ F4 c W LDA BULLET_DATA,Y
2 W9 _9 C' F( {1 q- D. v+ a STA $6004,X ;写入副武器数据
' v1 ~% M3 D! R/ w! H6 v: B RTS
) n1 S: v, `5 e1 j2 ^
, d4 i( d. x# U- K* O
" A+ F e" r; }8 EBULLET_DATA:
; d. S" \/ _2 Y6 F/ S0 v .BYTE $06,$02,$03,$04! H' T1 p- I7 l
+ d, q# c' z, ], @ a2 E6 ^6 p
& U% R' r& E$ A7 G) Y
% O, s1 t) q! X& H' ?KEY_OPERATE: ;按键开关操作
0 q) o2 k7 `( J7 ldata_protect: ;数据保护8 O5 l- F2 T# _- q) F6 P) Y
PHA+ C" {8 N6 ~6 R1 C
TXA
1 W, ^) d. \# U/ D' @/ C( O- z PHA$ ?/ C- B$ @1 C% v, G
TYA+ P3 [ a/ M$ I; A9 K
PHA
' Y5 X' l* e# x6 `; c) f% a Q
) }7 D" P' W# R" a7 FFLAG_INI: ;开关标志初始化% z+ m& e/ n4 y) I
3 N) a- [# x h" n LDA $600F
6 p ^3 `3 q& [* i CMP #$01
9 Q( |2 l! |: [2 R% P BEQ pause_cmp, h+ w5 o6 B2 [
LDA #$00! @0 n& y" H$ @# @ A/ p( c6 G2 B
STA $6000
l# Q: f5 A+ Y9 Y STA $60017 ^9 ^2 p0 c9 N" j6 Q
STA $6002" F# ~, G( O) ~2 x
STA $6003: n0 ?0 ~9 W1 k3 l [
STA $6004
" ^7 o1 E4 t. w# S, I/ g1 g STA $6005
0 s4 z0 Q; o9 ^ LDA #$015 ` c9 x2 c! d
STA $600F3 N" X6 h# R1 b* Y6 n9 V3 i% x. |* j
, `% r4 \/ A+ z* k p! r2 h- bpause_cmp: ;判断暂停状态
' _/ w3 h8 V1 c! G$ Y/ w LDA pause
6 z% M3 |' ~7 R) @/ L CMP #$01 ;判断暂停状态
# [6 \6 \* Z+ I" K4 ]$ Q( f BEQ button_press8 M: x$ `* q1 R
PLA
( c6 k6 a! x1 E# Z TAY' g& A1 ]3 G1 c: N& \
PLA
& m; k% [& Y1 w# Y0 W TAX' G9 O( s! U0 |+ t) {' X% r9 e9 M
PLA
5 i* J$ a6 |: I* }1 F0 R) |2 e: d RTS! r R N) d* g7 ?" a: e
/ L* U# x) | M1 R: ?1 ]7 j# V+ W/ Vbutton_press: ;按压操作' l, ]0 f# P: Q9 C: A
ini_Y:
: l% t& C' b: t* X LDY #$00
/ ^ S+ `+ C( I+ E* c s1 j6 mbutton_cmp:
8 E& ~* X, W! x LDA button,X
' u/ p% x. T2 B9 d. h: ?9 X5 K' s CMP ora_data,Y
4 `5 V. Z" M- r% |: S# } BNE count_Y_cmp7 y& g O: S0 l* y3 V6 A$ p
flag_cmp:
8 P. D$ f' p& ^$ O8 W) V LDA flag,X! q9 @" s1 `+ u, }
AND ora_data,Y
$ w9 u: V( z( B! F# c! R; a BNE flag_and
/ Z# M9 m7 i8 eflag_ora:
! d, L- A0 I& P3 _ LDA flag,X
5 M0 m8 P0 F1 x4 Z" X ORA ora_data,Y- Z& N& z% \2 K5 G$ J
STA flag,X
9 c# l, c1 G0 J6 v* g! ] BNE count_Y_cmp
6 O% i! k _9 ?, q# p! n4 Aflag_and:# n9 U @' n2 W0 N
LDA flag,X, a1 t. t; H, \ `
AND and_data,Y
$ H4 l2 k( T/ J% e7 y STA flag,X
7 e$ d0 q9 o t' T0 Fcount_Y_cmp:
. e& r% n$ X0 F5 |( \ INY! ~0 Q) Q& U0 d$ [ U) Z$ l
CPY #$08
- Q+ Q0 I/ v" n BCC button_cmp
% s6 v1 M/ \0 J5 o 6 t0 l$ w8 a& ]- ?8 r4 A' e& W
data_extract: ;数据恢复
0 V. s) t$ d' Z PLA
5 ~4 n d; n O* w; d9 K: y6 k TAY$ b+ h. c) r, H- ?
PLA
. P4 C* m) F/ a0 i; C2 ~ TAX9 ~* [6 a( W" \; _" ^( X& ~
PLA
* Z, ~- X! _/ V i1 w8 j
' ]9 I0 J& I# [7 K: ]$ Ereturn:
4 S6 ] I+ N9 c% y: @ RTS
' |3 @( @) |) Y( o; {! J- Q: W+ { & E' w, y2 v3 R; ^4 D
ora_data: ;按键相或数据
' _# q* B, W- [% n! o .BYTE $08,$04,$02,$01,$80,$40,$20,$10! N; l8 v1 T4 O* [% a, r' M( [$ Z) O
and_data: ;按键相与数据* C1 W0 f1 \- H4 k# |( e' `0 a$ D
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF* l" o; e$ W4 C0 k/ [
2 p$ k% t3 C( c# J( M$ B
3 P$ h3 n, w* C- q% u 6 I# f8 l( n& L; z) R( M4 n! U' Z: M/ F: ^
;FC数据搬移程序 BY FlameCyclone
7 `+ s) B9 m7 s- ]1 X: b& j) L8 Q, } .ORG $8200
+ b9 s; s; F9 v3 t( X JMP DATA_COPY_PROTECT
. F% O7 m& z: [8 L* m. @2 `& f) O& X. L* X0 ]. ]8 T
ADDR_DATA_TO = $40 ;目的地址
- Z$ [3 s6 w: a kADDR_FROM_START = $42 ;源开始地址
- a. c& L) L- [5 |" T! ^ADDR_FROM_END = $44 ;源结束地址; ^1 N3 c. B2 y) l6 b
. Q9 H4 N; ~6 }
ADDR_TO: ;目的地址5 _' D/ ^* p1 H1 O) n
.BYTE $00,$705 }4 A6 `+ E! Y0 k c9 H# t n" _3 K
ADDR_BEGIN: ;源开始地址
, R: o4 {$ @3 q/ ^+ F9 l) _ .BYTE $00,$83
- r, d( e z) V/ Q0 gADDR_END: ;源结束地址
* q5 q- K6 ^3 R2 o8 c" Q3 Y" F! F .BYTE $FE,$84
4 Z3 G# J! S# Y" J* a4 d8 ~; c" m& M
INT_ADDR = $08 ;中断地址( }5 {; M6 O8 e+ Y
FLAG_OVER = $71FF ;完成标志/ _. ~% U9 U% A1 _0 ?) P" ]( O
" H2 B" _) R8 y( J% w0 S
$ p" s9 `8 k- c1 y* }
DATA_COPY_PROTECT: ;保护数据" l( b+ S7 s" X0 A6 j
PHP* c: z1 D, O5 p* W3 o! V# i6 c
PHA
$ g) u' ~2 k; R/ j6 y8 M, w# z TXA
9 P" f" ?- V5 f5 w7 N PHA
; [$ ~0 A' M k8 m TYA) n/ H' ]% {% i B, W$ w( q
PHA2 @ Q2 d+ G) |- g; q
LDA ADDR_DATA_TO
5 `: c2 L4 h4 w4 S PHA: s; P j& `$ z" a8 A
LDA ADDR_DATA_TO+1
& i! J# f- q9 E) W9 A( J0 N% d PHA! T& W1 B7 w2 m( b0 ~
LDA ADDR_FROM_START7 {+ i' f( J+ Z" V( z, @6 w
PHA
( y4 y( Q3 C- H, ?* b4 q) }2 M LDA ADDR_FROM_START+1
$ R: e* T* C3 Q. {: d. o6 M PHA
: U. [: A* C' M& l LDA ADDR_FROM_END
% Y" z F3 n( ^7 O! z' x: { PHA! N6 w% g) |- N( v$ S, S( T" h( h
LDA ADDR_FROM_END+13 T& x; B8 w# |
PHA
5 T9 {3 |( N. ~ N 6 o- i) v- o2 o, Z
OFF_INT: ;屏蔽中断
7 K2 l& i" _1 r& S LDA INT_ADDR4 C5 p/ a( z, g& _
AND #$7F
# z* \. h/ |$ i STA $2000 ;屏蔽中断1 Z! }9 A6 R9 ~) t/ u3 q3 j
1 S5 M3 h m' q2 H9 W
7 ~; [; p" |, H6 }8 J' E+ p0 mSET_DATA_ADDR_START: ;设置复制起始地址
8 T5 J) ~1 u, [' _- N: K6 L, q LDA ADDR_BEGIN% Q1 ]; ?9 b6 d
STA ADDR_FROM_START ;设置复制起始地址低位0 X3 v5 X2 U/ S9 S f" J7 R
LDA ADDR_BEGIN+1
) F, K3 j, ^* Y4 w2 U7 G2 j* e STA ADDR_FROM_START+1 ;设置复制起始地址高位9 y' t3 }, Y _# H0 P$ D
8 Y/ e T) c; |3 Q- {9 Y9 pSET_DATA_ADDR_END: ;设置复制结束地址
- ?$ C6 y/ k" E" r0 O LDA ADDR_END& ^+ f9 e% t' P3 m$ S" L1 o
STA ADDR_FROM_END ;设置复制结束地址低位
: n5 [' H5 ?4 \2 ]) y8 z LDA ADDR_END+17 r) {! |3 @8 D/ `$ _5 v% N
STA ADDR_FROM_END+1 ;设置复制结束地址高位* p2 N/ e, D+ _8 E
: F; @4 A7 s. z6 y- D; dSET_DATA_COPY_START: ;设置目的起始地址
& N0 B3 F- d4 S H+ S f$ `0 U LDA ADDR_TO& M% r$ U: Z8 ~4 _% }2 x
STA ADDR_DATA_TO ;设置目的起始地址低位
3 @" r8 I# i6 ` LDA ADDR_TO+1: c' @, S" F/ Z) V
STA ADDR_DATA_TO+1 ;设置目的起始地址高位) u) y4 g. d* `) {) b5 N) z, W
2 d( o" {3 E7 r+ p4 x j
OVER_COPY_CMP: ;复制完成比较( \7 N; [" u2 k% l% C
LDA FLAG_OVER
% e, Q1 e5 L" ^: G1 z1 n" K CMP #$FE ;复制完成标志比较: q- j* l, w! K! s
BEQ DATA_COPY_EXACT
) P/ H$ d4 G0 R7 {9 f* W6 S0 d
6 {6 i3 L: W( \& JINI_XY_COUNT: ;计数器初始化" }& m1 {$ f2 j1 h+ B% m
LDX #$000 D9 z9 F, ^- m9 @* b# W
LDY #$00: Z: V1 L; ]7 S, v6 m
3 a* n$ Z t! T; D* ACOPY_OVER_CMP: ;地址比较/ Q+ @4 h" y) H8 n$ L
LDA ADDR_FROM_START1 w D% T* v. J7 _1 p9 T* ]
CMP ADDR_FROM_END- n: o( Y4 k) e
BNE COPY_START5 A1 j5 p# Q/ k3 S {4 _9 G
LDA ADDR_FROM_START+1
y: S8 s* G' y2 Q/ k CMP ADDR_FROM_END+13 e! X0 W, g1 ~& R0 x& p
BEQ COPY_OVER# L J' V, I- `: T
1 Y+ c" c3 b7 \! H1 v7 W8 n0 WCOPY_START: ;数据复制开始
: b9 r& F& h+ M* s2 Z LDA (ADDR_FROM_START),Y ;读取源地址
& r8 T3 j1 M H) n/ ]% U STA (ADDR_DATA_TO),Y ;写入目的地址
X9 X! x& j8 A9 @ N1 l# }- h INC ADDR_FROM_START ;源地址低位递增
. x- W, c& u+ c* L: D" B# ]! ? INC ADDR_DATA_TO ;目的地址低位递增
6 x0 P1 G4 O7 x; H! T BNE COPY_JMP
1 s2 D" _9 g5 L4 [ INC ADDR_FROM_START+1 ;源地址高位递增4 r8 D+ S8 h/ @( e5 r
INC ADDR_DATA_TO+1 ;目的地址高位递增
3 h$ d+ _& g8 E K; B" x
' q. W% v. l' N& ~* B; c/ bCOPY_JMP: + A" r! @4 r8 X2 Z
JMP COPY_OVER_CMP5 V" G' V; u U" v
1 f, G9 w' F; W4 ~3 c$ T! R
COPY_OVER: ;复制完成. o5 r4 K0 H6 V& d2 q6 G
LDA #$FE% G7 C- ^. k" Z: D9 W
STA FLAG_OVER ;写入完成标志; S ^& _7 M- J" f' `
FINAL_BYTE:
! r. P3 c: U2 ~# T LDA (ADDR_FROM_START),Y ;读取最后一个字节
) L: v8 }. f9 ^8 W, _8 U STA (ADDR_DATA_TO),Y ;写入最后一个字节9 _& j$ P9 U; K$ `$ w$ R
6 f4 |0 U7 n# F3 f' ]1 {/ VDATA_COPY_EXACT: ;恢复数据
3 s' p& S6 N; f LDA INT_ADDR; P1 O* ^; ?3 W+ y
STA $2000 ;恢复中断
1 v2 v3 D6 x$ D# i* } PLA
3 K! I* c- u, X' e8 P% j6 A+ d9 a) | STA ADDR_FROM_END+1
' d5 C; r6 W2 I: @( [ PLA
) P" ~6 O+ M$ G) s! w" z# \' u" h7 E. P STA ADDR_FROM_END* \% [1 k9 O# s. h
PLA
0 m4 D: b- Q5 q- U) H9 v STA ADDR_FROM_START+18 A7 }) Z* t1 K; G
PLA
$ P3 {- m7 s3 w# \; @ STA ADDR_FROM_START
. h6 o9 A! j8 a PLA
/ O$ q% t4 r, A* @ STA ADDR_DATA_TO+1
& C) e9 H+ R7 S( F' } PLA8 v0 f, W* y5 j/ m( |" H
STA ADDR_DATA_TO" o( ^+ S+ E5 |' O
PLA/ R- r. ~, }) b* L+ t: ?/ \$ X/ f1 G9 L
TAY
9 u5 C& I9 l; q& b, ~! R: i7 r PLA
0 I' j: D6 S9 b% m+ @ TAX
+ x$ ?) `# b" b' Z! V PLA1 u( e* ^$ j% X" k3 S6 k
PLP2 }1 F+ i: Q; e3 i( w
/ x' y# d# ^4 K
" D) e1 H, j# Q& U# Y- z2 v/ F5 q
5 o1 e3 R* L/ `; c! c+ BDATA_COPY_RETURN:- m( g) B& H0 d- _& v' L
RTS. o6 l' ~6 _! \7 Y+ k
1 T% F" z& ]8 \. r9 d- T5 B- L .ORG $C056 ;精灵指令覆盖
( k& w- F, ~! V/ I# S JSR $FFB50 U* Z; M# l$ D6 X9 n
" X3 r5 D: o4 N* I: j' G( @ .ORG $FFB5 ;9 W# W( A5 E+ `
PHA
- {& b1 h6 D+ A" q1 U TXA/ w! h- r4 }% U) n5 |( Q
PHA1 g S% u. C! S9 W4 V
TYA' w& O4 W2 ~4 O; x) p
PHA
7 Y! }# q% F6 x7 e9 o LDA $71FF ;比较7000-71FE数据是否完成复制
# C" C; c" ^2 j2 c% E CMP #$FE! j: o2 G/ u; U* w/ S
BNE ADDR_FFCA
$ w* Q, r. {6 W0 _: w PLA8 o5 e v4 L8 m' [
TAY
1 |9 |& V& ?, L# U5 V PLA* B7 u7 d1 q6 b" ?% }$ d% d3 U
TAX
/ M0 F" H) v. _! J PLA
* M! b" ]* o1 H& b JSR $7000 ;跳转到自写程序0 \! }# M9 h8 M) N& i. S
RTS
( R3 o1 b. g1 Z9 ^) xADDR_FFCA:- q, R! G- q* W/ I
PLA5 K1 G0 Q9 A- P; ?" U/ W+ a
TAY
1 _- H' `! a% |5 Q PLA2 \* e, K. @7 R7 a! S
TAX6 u; O5 o+ r9 V/ w' s4 F" [& O
PLA
$ [" {. p6 H) }9 r% t# I# o9 \ RTS& [/ |$ s6 N" D f' |$ X
( S: q5 u( [* X/ ?
$ G; Z; L! t) F4 P7 L- q1 o8 c, o4 X# @$ Z
.ORG $C264 ;自定义的MAPPER2切页程序5 q/ Q7 l6 C; x
PHA
2 ^, K; X+ \% w+ ]+ q TXA
6 I j8 D- Q( Y) C" f- r PHA4 h9 k3 w& M9 P) y, N: Q7 V
LDA $0066
, c5 D U A- O. } BNE ADDRC280) [; ?, O6 W- S+ O! b% v
LDA #$07+ H% d2 ^( B0 I
LDX #$034 X( ?7 C9 t$ O- K
JSR $CD9B ;自带的切bank方法
; W* ]% E) H7 W PLA
8 l8 a7 f' p! } TAX
+ X$ L' U. o, f7 N/ l8 h PLA
) y% C* [7 E1 h. ~6 I4 I JSR $8000" \, V' v6 w: n* @( D) m
LDA #$06
! K8 d0 Q8 U9 W7 v$ H6 F LDX #$03/ T- W7 w& p( d# v% }/ b) q) x
JSR $CD9B ;切回原该切得bank(可以不用)
' o- m! k- e6 k! D& R* W/ Q8 d3 s RTS$ W0 O: z7 n3 l
ADDRC280:
. X5 C( [) s. S4 U* }2 o PLA: z# E/ w0 B0 ]2 b( |8 u7 k0 D
TAX
3 v( h$ @ i' k2 Z4 Z+ q/ j- ^ PLA0 M- e. [" B! F+ S1 u" U
RTS/ g& o4 {2 k% v. c& I
" J5 D8 M4 Z8 F. C
9 Y! p4 ^& L- @# ` c% a
;[FC][最终任务PPU][END]
& w$ q* n/ m: y5 m/ K .ORG $C056 ;跳转到PPU重写程序6 V1 S' M4 T. H% ^( Z" ]& j
JSR $7000
9 z# _( T8 X- s3 x {, }5 f8 F! p P
& m! e. ?# M, D .ORG $CEBF& V8 S6 q, u p
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
$ B4 j+ s7 j6 J7 f& T- Q ' ?# ^& \3 a; O! ~8 o
.ORG $E460
) l3 ?( @% Z: G2 W* w: Q1 \ JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
" c) `- o' q- K
* m2 K5 k# T3 J+ W .ORG $71F0
7 m! d& D1 Q6 k m1 J7 FSTAGE_DATA_WRITE:
- H) `6 s5 E% g, D. B LDA $6010
: O( f2 }9 N& Z7 q" S- ^ STA $1E ;关卡写入
8 `8 \* J# t1 D A7 v- N7 f# | LDA #$004 ?$ r" ?2 V: u( y$ z
RTS
) w( |3 ~8 L% I- J7 |0 y3 b) S .ORG $71C0
" y- g) p; J" }" U3 eBULLET_DATA_WRITE: ;副武器数据写入2 Z$ K1 x! L2 t3 |
CPX #$0E
% W* H9 P, A* _3 t; l8 ~2 S BCS P2_BUL z% ^" B. U, ]( r# A: t9 {
P1_BUL:
- t! |" I4 O2 A LDA $60042 K: w0 e$ a+ c0 w
JSR $D7D0 ;P1副武器数据写入' \) n4 a6 G% ?2 M7 A/ v: P
RTS
: e* l/ o' t, A* p" J% uP2_BUL:
/ t1 C: e; U6 f/ [: k LDA $6005
+ e& g3 u; V- \9 T0 P JSR $D7D0 ;P2副武器数据写入 {% ]) C2 P: T, m. d; r+ E& t
RTS% n0 H" H: I" |
5 M7 s/ R& e8 y
' V( d3 O2 d% [% `( |1 V5 T# Q' {/ G .ORG $70003 ], y' Q% s2 P$ _8 R
! |, m0 \# N8 ~- q
STY $4014 ;补上覆盖的精灵写入指令% w4 v9 u0 @* i, S4 E/ F/ b
PHA
/ O: A) i6 G) I$ P% e TXA
1 d4 b* E0 h- N' L4 @$ K. f PHA/ _' `8 {: _6 |3 r3 {% K' c
TYA l( k+ \) a( P2 R
PHA1 I6 I. \: l5 I" h% E5 W3 x
LDA $0C4 D- r* d6 ]$ r( S8 M
CMP #$01 ;比较是否为标题画面' N8 }! I$ ?8 H( X. L
BEQ PPU_STAGE+ n+ f: D, z; f: o/ V
PLA+ \- N& K4 L: l
TAY4 Q( Y) H) f/ G* W6 I
PLA) I- k) y& w" z
TAX
$ r% p' R2 U$ J3 a, R) ^ PLA( ?2 ^& A& M) ]
RTS; Z; S- H2 {9 l J
PPU_STAGE: ;STAGE显示程序
/ S+ T! E# c9 R+ A0 r LDA PPU_ADDR_DATA# }( U: f* ]& F& z) p
STA $2006$ _% e: e, y% G; `* W. e
LDA PPU_ADDR_DATA+1
; d. T4 K* x6 K6 e- O STA $2006 ;坐标设置
/ I7 o' N+ i) e3 M/ g0 J/ W9 ]* m/ O LDX #$00
2 A( a9 b. G# {2 Y5 f. M# fPPU_STAGE_WROTE: ;写入STAGE字模
, U% J. ~: z: W: E3 @, ?/ x LDA STAGE_DATA,X/ c0 c7 ]. p1 S9 B
STA $20070 g L8 k; S) U* s0 K% K$ g
INX
; O$ V+ G( B( X: N' \ CPX #$06
. _0 p; G9 z1 K BCC PPU_STAGE_WROTE! `) ?9 Q& F) I! n, P/ T; q0 f: [
LDA $6010: G" ?) @2 J0 O, g: w
CMP #$FF ;关卡数据初始化条件判断
) x7 N3 p2 x4 ^ BNE KEY_B8 t% }" M" j, o1 e/ _: C
LDA #$003 m/ c+ G( K4 g+ M2 q- T- E2 E+ K
STA $6010 ;关卡数据初始化
$ g- M0 O8 w# T, b0 `KEY_B: ;关卡减少1 ]5 g8 [# c! P, x$ @/ n- p; n
LDA $04
5 i1 O* @+ }# ^ ]( ?1 H. y3 i AND #$42 ;按键B或左减关
+ u; V9 u$ j' x. P. R" ` BEQ KEY_A
$ H' ?0 w4 r$ o# I2 M2 L& w LDA $60102 I3 { L( W7 `8 C# t
CMP #$00 ;关卡比较/ F4 n: x% {2 |* H j. P
BEQ KEY_A
( y/ z4 i# W5 O! t DEC $6010 ;减关
2 `0 r( I# c- C# LKEY_A: ;关卡增加
, b* i- M# K0 w, y6 D4 _ LDA $04
0 a+ w! j5 t& J$ i9 } AND #$81 ;按键A或右加关
9 e2 p8 b, o* R6 i BEQ PPU_NUM_WRITE- F! L7 U5 u( t1 A$ y5 t' x
LDA $6010
. j$ y, C, u# k+ T: P) N* q CMP #$04 ;关卡比较
1 x6 f% y3 r" d+ ]: T BEQ PPU_NUM_WRITE+ ~( P3 ~) m* }
INC $6010 ;加关% |' R$ D5 ~, F5 S, {" Q
PPU_NUM_WRITE:
# C$ Q: y( K( s# h LDA $6010
' n* R, z3 V7 E5 m( j TAX- i T0 {! c% R# @6 E* Y* Z; r1 X
LDA STAGE_NUM,X ;写入数字+ c5 ~: C7 B" @ p% l8 G! {
STA $20071 d& `$ U/ E8 E
PPU_RTS:
0 ?* B( ^/ e- o PLA
7 |2 ?5 t! }$ C7 n TAY
' {2 v& u8 o) d9 n5 o PLA5 {5 o+ J) a, F; d
TAX1 l+ \* Y) K2 W) A
PLA
9 ?5 r f9 b! R. R: ?( m7 V RTS
6 o6 X/ |7 Q4 p! n' v : j8 H$ E$ {" \ Q0 z6 Y$ C
+ h l+ O6 M9 Z
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据1 d8 M: ~8 K1 T0 o. T( |
.BYTE $EC,$ED,$DA,$E0,$DE,00
& R% `6 x4 l, ~! C3 m' e3 O( \STAGE_NUM: ;关卡数字1,2,3,4,5字模数据8 \8 h! Q9 ^* \" w- D$ V5 P
.BYTE $D1,$D2,$D3,$D4,$D5
$ D g3 L0 }7 K4 y$ S4 R
2 \5 B3 ^7 ^6 F4 @PPU_ADDR_DATA:3 I- w" w6 j; b# l8 E2 k
.BYTE $23,$0C
( r% k5 N! f" q2 Z! t1 S+ W5 A - }3 U! O9 h4 E! K" N" {% `5 A/ n
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|