|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
2 E, X! F( a- O+ B3 L1 _/ S& Z% p9 A2 |# P4 {( s
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
7 [5 u N" F! ^9 J. [. q然而,今天想到一个思路. w/ X( g! {+ @
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.5 k* I( y8 \ W* _. ?+ g. S- k1 h
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE# @9 ^! g$ Q' G* }( Y1 F
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).4 z/ h. {1 Z. R0 c3 G
3 O" e! D* D3 @+ M
+ _. L% g7 X s6 q8 n; W, @6 l;[FC][最终任务KEY][END]% Z( X! X5 ^. \7 S
button = $04 ;单次按键
2 a4 N- D5 J \* ~3 @flag = $6000 ;功能开关标志% J/ B+ q% e# Y/ m0 Z8 Z9 d
pause = $000E ;暂停地址: A2 x5 q+ h1 V8 ?* E
2 D0 A6 I0 C' O. ~* O
.ORG $8000
0 S4 L1 D+ x" p6 L) a) } LDY #$08 ;自带的按键程序5 _% s6 p. {, v o, U
ADDR8002:
3 V# f4 v, n9 ?+ C2 I9 \ LDA $4016,X* h$ e" \$ u: K( W6 z2 g& l
LSR
6 e1 o6 [% v6 L- [" r; p. l- c$ s ROL $0021$ H6 ^3 b p" M" ^
LSR* X8 {6 Y. g5 `- e" w$ `
ROL $00290 P; e1 O V; }) s: t& d
DEY7 L7 ]) T- w. d f0 U
BNE $8002
F% {/ S' p; L* H6 ?* [ LDA $00213 F. Y a5 ?9 g. ]: X
ORA $0029
- N2 M# m% J: g; \ STA $00218 _- q# m8 Q7 |# w
LDA $0020
5 `# V/ G5 k5 ~9 H AND $00216 ]6 y+ v. {, H0 U( T$ q
STA $00208 Z W0 T& L8 z" L# j
LDA $06,X
! P) q- Z8 B3 F* H# C EOR $0020" l( v" y' t8 Z' y
AND $0020
0 B/ I8 Q5 g% w2 C8 H' [ STA $04,X
q1 X8 y% O' c: B1 F& N# K LDA $0020& v3 h' Z) @+ y m0 _2 ^
STA $06,X4 @4 Q8 Q/ _8 V' Q% W+ T7 _0 z
JSR KEY_OPERATE
" a" P2 Y2 Y4 U& H9 x) K JSR Function ;功能调用2 U6 u) \0 _* P+ T
JSR Weapon ;武器切换调用
/ c! c: ?/ R% U h+ n& \ q+ R- F JSR Power ;威力调用
4 D, ^; q7 i) e8 Y. z JSR BULLET_NUM ;子弹数目+ a/ {* g2 b9 F; `' B0 X4 a2 {
JSR BULLET ;副武器类型
9 q7 B, b6 N) H8 s2 u' q( \; t RTS
) `9 g7 S. R6 e4 I 3 m$ W' ]* R4 b& D4 j" o( v3 ^
/ Z# _* `3 u) R3 I" C* L0 T* x: W
1 z- g0 |, `$ [
.ORG $8050! [; g3 ~1 o" s# a
Function: ;功能. e% A1 J7 [! \: ~
WUDI: ;无敌
' e/ a# a* x- Z7 Q) o LDA $6000,X
5 u9 S8 y, U- t- M, K- { AND #$08 ;开关判断7 o" k+ H9 u0 s. ^
BEQ LIFE
/ A; B8 u8 o0 `; B% a LDA #$05
8 l7 O# E8 A+ g6 K9 G+ G5 z5 j9 r STA $05DC,X ;无敌锁定4 A; m& C8 q/ a8 T; Q
LIFE: ;生命
/ w4 b6 ]" F/ A( M LDA $6000,X
B4 K6 P% s3 X; ~4 R- \% ^ AND #$04 ;开关判断
, N( F8 s6 ^* ~7 M BEQ FUNRTS
/ Y' g B* F% w# S, ?2 a/ g5 t LDA #$05) N: _, G: q3 I' r) ?# V& G Q1 `( j
STA $1C,X ;生命赋值1 {5 S3 L, Y* o% y* i! B, I
FUNRTS:
* r2 a" H( l9 K" e RTS: u& P y! T( g1 N" \4 P: s1 {
- {$ X7 [3 e. x7 rWeapon: ;武器切换! A% h( W; L3 \2 [
LDA pause ;暂停状态判断
R6 M P- J- x7 ~; O% j+ I2 t! B BNE WEARTS+ q7 e$ U1 c% t; M% o" G/ e
LDA $04,X
6 c. y8 f: Y* y9 U8 N CMP #$20 ;选择键判断, {/ [0 b7 }2 x" Z ?6 i
BNE WEARTS q2 a/ v! g/ w5 i1 x
LDA $12,X
' V" c( A3 @' R$ \% D$ } CMP #$03 ;武器值判断
T5 }8 q( g" l$ t# q$ z- r1 ~ BCC WEAINC% C4 `: ?4 n0 J+ N* L. K5 P
LDA #$FF% i& k% N9 S" D* D7 C# X$ T1 X
STA $12,X ;武器重置; a/ Z3 J) n$ \$ G. B
WEAINC:' ^: {6 w# _+ I& [
INC $12,X ;武器增加$ b* n, O8 }4 R3 `
n: _* |; y2 _
WEARTS:* Z. C$ L) w4 {. t
RTS
|/ J7 m1 A$ @) Z" m
1 b( |2 |) k& iPower: ;威力
" ]. e; ^& w: m6 ^$ z8 I4 w" K LDA pause ;暂停状态判断' R" y+ d9 L9 ~2 ^
BEQ SPERTS, ^; P5 |2 _$ P
BUT_LEFT:
; o4 o+ r3 J9 Q/ l1 C LDA $04,X
1 j# U' v4 S( v% X) q CMP #$02 ;左按键判断+ i3 L: A6 A) G% i8 T2 L
BNE BUT_RIGHT
* J8 H0 A5 I0 a4 U, m LDA $88,X2 s# s$ l' H; v: U: W( p' g
CMP #$00 ;威力判断
4 c5 \( k# f* ` A5 P" s- i BEQ SPERTS
* x& v+ ]* l1 g! \' W3 zSPEDEC% k: E5 X8 l$ S' Q
LDA $88,X ;读取武器值2 K. ]1 [8 D, x' j; ~
SEC
5 M/ B2 h8 B: K SBC #$08# J$ @5 } a# `3 b9 I/ b- V: ~
STA $88,X ;威力减小
% [6 d3 F$ l3 b: Z1 @: lBUT_RIGHT:
& H) a$ L* [1 M( F& k4 v* O6 ? LDA $04,X
% ~7 _$ A# ~ h4 h' j1 r% `' G CMP #$01 ;右按键判断# _; ^0 G% ] [' d
BNE SPERTS" T9 e/ G$ m. N& V* S% H
LDA $88,X0 {, a& i9 a6 T
CMP #$10 ;威力判断
: x$ s. Q5 D( T t; y* i# s! v- }* u BEQ SPERTS
, o+ J+ `; [6 ASPEINC:
5 v: V H7 u* c, Z; M& q LDA $88,X ;读取武器值 y: M1 |# S( g' z5 I# l# ]8 b3 d( | c8 ~
CLC
* x( z" j; c1 [$ j7 P ADC #$08
- T4 q1 b' {: l/ o% s- L STA $88,X ;威力增大 D2 ]. l# d0 p0 Y5 k9 c' k6 L0 m
3 T1 x: T% x5 |3 x: K
SPERTS:) Z# D, B0 h) R. v6 d( X/ j8 _
RTS' t) w( B2 Y( d9 ~$ | r
3 f Z. N0 f% YBULLET_NUM: ;子弹数目
9 D, g( G" Y& l4 M' y1 z7 L2 N LDA pause ;暂停状态判断4 N" I6 g5 h+ ]2 v; V# f9 b
BEQ BULRTS
! A" D8 ~$ [: `" p' T: } CPX #$00 ;主机玩家判断 ]$ s+ B4 W2 u" |
BNE BULRTS
9 u9 o: L, ~. o. c; G9 E LDA $04,X ;主机玩家判断2 [7 A4 F4 i$ X: M1 V" K; t
AND #$80 ;按键A比较
. w4 X7 r; L3 }7 g" `9 p3 Y BEQ BULRTS5 h( ]% Z( T5 U M0 {
LDA $87 ;状态判断. @ E6 V- j$ a) E/ B0 k* P& M
BEQ BUL_2
; m/ Z3 M4 j& U( J2 K* W" C, cBUL_1:
: c0 Y. f4 p# h& u* B) _0 F7 s LDA #$004 f7 ^% L' c4 l! \9 z& U5 B
STA $87 ;1发子弹- f, H$ z7 _4 }$ p3 \
BEQ BULRTS# S2 \$ X& v! C
BUL_2:
# l1 e. j2 x8 N, O5 t8 h LDA #$01
5 ] f, s3 h+ h STA $87 ;2发子弹; `+ W! m# w: ^. ~4 b$ [4 Z
@3 u1 F0 W6 E/ ~# JBULRTS:0 Z3 c9 C& J2 b p' f6 Y
RTS
+ n( x) N" m5 Z0 U+ e! |0 N( I
4 F- Q! X Z, w* j! Q' C C1 d4 U: y; H% t: h, k9 {
BULLET:5 X3 I# E8 E) p, {3 C" |' z6 _
LDA pause ;判断暂停状态6 z% ~8 b8 O) n/ j8 j
BEQ BULLETRTS$ N* `) B7 h. J3 t& Q
LDA $04,X0 [" O. R. v) e9 j5 K" F
CMP #$40 ;按键B比较7 M; H- F% `; a1 R" e
BNE BULLETRTS
9 X# |! k; F& S1 ~1 S; p( o: \ LDA $6002,X ;读取副武器" @& O& u2 ^+ ]% I: Z
CMP #$030 Z7 N f, x# U
BCC BULLETADD
6 ~0 u$ {1 g! L R LDA #$FF, a, }" O$ s5 e+ q' M/ S5 s2 U9 w
STA $6002,X/ ^) l2 |( n. t: z; }8 t8 E
BULLETADD:
. z2 S' l8 v6 u* p% S, `' u INC $6002,X% }/ X( B8 P7 v4 i6 v) {
( e: P/ U$ I/ W5 b) D
BULLETRTS:
- P4 a" e2 G) y" q LDA $6002,X; m" b" y% m6 E8 n" l. ?
TAY" _3 g- y- ^; I+ u1 W" _
LDA BULLET_DATA,Y; N$ P* z3 {* F+ G3 D; g! G0 ^5 R
STA $6004,X ;写入副武器数据
) z. S) ~2 [$ [9 L* |% \ RTS6 P6 a+ h7 ` \9 R% k8 N
3 v) _% e t$ a/ w7 z
& \( D4 U/ `9 J% M3 P- MBULLET_DATA:/ o2 ~$ @7 p( K4 H& Q! o: |
.BYTE $06,$02,$03,$04
# u" N( b! N3 M2 N/ E5 d. w3 M Q' D4 @2 `9 E$ K8 j) g
, t; ?9 a3 L# I6 d& \( F, W 1 f* g+ W& Q) Y5 B: A, E( {
KEY_OPERATE: ;按键开关操作 p2 G" L0 x8 H& ^0 z
data_protect: ;数据保护
# \) e) o2 ~0 u/ k PHA2 ~' K4 r+ b, ?5 N+ j, d/ Q2 @
TXA0 F$ ]0 n" V$ t, f5 _
PHA. i1 Z5 B5 K6 u0 i; m4 u
TYA
) B! p. [, _& B0 N PHA% S7 N6 r- |6 u9 v
' D8 T. U }0 P( G6 }2 p6 ~FLAG_INI: ;开关标志初始化! z% \* G* q1 g1 E
" h3 Q$ n- \, D2 T5 L& @4 J" \8 w LDA $600F
6 r! _. |9 Q/ m3 T1 P$ \/ [ CMP #$018 n6 p& h* u1 G. u) \
BEQ pause_cmp
% o9 k3 y7 C0 ?& Y4 x LDA #$000 s0 X6 B1 _. s& c3 Q8 q; W
STA $6000
' v* h7 i1 f* i! X' a% E6 g STA $6001
7 d, t" `+ k! { STA $6002! k: E8 y$ d: V: i% C/ p
STA $6003
+ N, O6 `- n1 N/ \" X+ x: ?% C STA $6004
3 t9 D% v. g" p0 Q STA $6005
4 r s" c% N9 F5 c+ m( I5 d LDA #$01
' H' }) e, F0 D1 T. S STA $600F
' |; G6 @2 S6 t/ ` * a$ _3 T1 o( ~2 ?1 h0 u
pause_cmp: ;判断暂停状态" ^4 S2 o3 s4 z! u
LDA pause
1 k$ |. W# n6 i4 V& B# u+ o" O/ |& R CMP #$01 ;判断暂停状态
" q4 H% c0 U& T v% t3 C BEQ button_press
( ~. W3 t. K* l% e) c3 ^ PLA! Y0 A8 Y! s" b# n9 I
TAY4 b' L. v; Y! G) \' V; D
PLA
* _2 {+ F9 M% m% f- {1 p TAX
4 O1 ]2 O; a2 H- F a PLA
/ Z5 ^0 Y( ^1 `& c8 o7 X RTS
6 p9 a+ e4 t* p+ {, k" j! Q" K5 U! [: O6 h- H
button_press: ;按压操作
! j) _9 T8 Z, E4 X8 H, L4 ~ini_Y:
2 X C9 I# A/ T! w: @ LDY #$00
- c6 J5 Q7 [+ Abutton_cmp:
. S4 C+ C+ X1 X5 {+ v LDA button,X/ t! t9 n! o# m1 B7 J! s5 _% Y
CMP ora_data,Y
% [6 o0 ^) {3 \& m- W# Y1 w BNE count_Y_cmp; m* e) F/ l- O6 D# ]" E
flag_cmp:$ z+ l/ }: O2 I) g1 F- z
LDA flag,X
7 |+ t. U9 N( v$ z' L8 q AND ora_data,Y
& `; T6 Y& j2 {9 Q9 c BNE flag_and7 M ]6 X0 n1 K4 _% u5 g
flag_ora:
" w' L7 p& M$ Q- A LDA flag,X1 E7 \4 ] O; E9 \; h
ORA ora_data,Y
6 n6 Y/ J9 m4 X& j STA flag,X
" m; i$ S# C5 l8 W5 [/ { BNE count_Y_cmp5 [: S& d5 f* w- d- v$ I) s
flag_and:
7 o; l3 J% Z! T& W; K0 M8 ? LDA flag,X
_- j- F6 T3 }+ W o AND and_data,Y% W1 K+ o0 m; s3 }* }9 B8 \
STA flag,X: r' |) Y& A$ A
count_Y_cmp:. b6 J7 `0 v5 z5 u3 j2 v: k
INY2 z- _9 N) T2 R; @6 ?. ?& Y
CPY #$089 ^& ~1 c& w* K' }- K. z. z
BCC button_cmp
: D" c! D) a6 @8 J6 i- m 2 q3 g3 E+ C [3 L3 h
data_extract: ;数据恢复
9 u8 J, L7 F" D' A/ b+ i. f/ z# X PLA& Y9 R4 R0 L( D( Y8 j
TAY
1 C5 B2 \7 E9 C: K: e PLA- w8 H; v2 n% F
TAX4 r2 u2 g! w. n/ g
PLA
0 Z/ c7 b* o; \4 H, M
: v i$ g2 p/ Preturn:
( a5 t1 q/ H5 V( V RTS
6 w, P; ]! A2 m* `% R+ p ) i( |! F4 r8 {& `9 V# z E% Q
ora_data: ;按键相或数据
# T; L/ o# p- T& ]. e .BYTE $08,$04,$02,$01,$80,$40,$20,$106 m5 k, U$ m" g9 h2 e
and_data: ;按键相与数据
. A+ b# L0 m1 x! H; q7 _ .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
( r4 t$ b4 i0 I; @* ~2 a
4 u8 r2 P8 k# g6 m1 ?0 L% }6 Q / S! H& }) M% [# G7 Y
- A! q7 t& P' F$ ?$ G" \
;FC数据搬移程序 BY FlameCyclone
I5 I2 S, O6 W: s .ORG $8200
) k+ p4 d& H* w6 C JMP DATA_COPY_PROTECT Q: j' @ B' p5 B1 O
9 R' S1 `# M$ p6 i* I2 jADDR_DATA_TO = $40 ;目的地址
5 [( U5 ~! e$ W" x! |6 bADDR_FROM_START = $42 ;源开始地址' H& |' S! j" S
ADDR_FROM_END = $44 ;源结束地址: L7 v' ^. X1 L5 ]) |% V9 P! o* z% H
+ D' {/ b N) ^5 f; z. }5 j- r
ADDR_TO: ;目的地址) U+ |' ~5 t* y4 U
.BYTE $00,$70
" ]2 e2 d' ^# ]: U1 d2 B0 VADDR_BEGIN: ;源开始地址. K- d4 ^2 j$ _
.BYTE $00,$834 P" v" i' d3 Q: ^8 ~: `& [2 z. B/ }! s
ADDR_END: ;源结束地址
3 C/ l8 E4 L4 B+ a; b9 N$ ? .BYTE $FE,$84) @8 E5 e, l: i' c) p
$ Z) {/ V5 q: z0 V0 f3 O# X
INT_ADDR = $08 ;中断地址
1 s/ `9 s2 @, b% P1 UFLAG_OVER = $71FF ;完成标志8 f& Y' W3 [* f4 f3 L) |
r* C- D- S/ H' y( _
7 q: a6 V1 m. c6 r2 q( KDATA_COPY_PROTECT: ;保护数据
" I6 z+ s9 o8 L& r+ K, A PHP8 S9 _! o; i9 D! ]0 O+ g
PHA. Q5 Z7 G" }/ M; C' c
TXA2 Q% T/ V5 B9 P, v1 }/ W7 O
PHA( T/ s' V! s6 h# \8 Y( q: H% D4 O' m
TYA
0 i" |$ ]# ^4 A! c3 g2 a PHA: m1 T; Q6 h, V+ U) f
LDA ADDR_DATA_TO
3 r( `, ^' L4 y, j2 F PHA
8 F) \+ _8 B* Y }7 O; } LDA ADDR_DATA_TO+18 M# t+ p) Q! O: T3 V) w
PHA
* g! b/ E' N2 `) E4 ` LDA ADDR_FROM_START; h' e- ?# l8 T. M1 T ?0 ]
PHA! j3 W1 l- r D: |8 T+ T
LDA ADDR_FROM_START+15 o5 q0 C* ~- k( V( _# P
PHA( R# T# ~4 E$ t# O
LDA ADDR_FROM_END
/ I, y# P+ b9 a PHA, E2 N. F6 p9 _! P
LDA ADDR_FROM_END+1& `( g+ G" _% V+ @) q# ^& S
PHA
: R. {- H- s* G. v# a$ ~( o4 N) Q# v
5 D \# v: k+ {$ K8 p& C2 H& e' ^. UOFF_INT: ;屏蔽中断
& H* i% F% A5 @ LDA INT_ADDR% S# Q) f- `7 Z
AND #$7F8 x' V' i# e+ c2 ~0 \
STA $2000 ;屏蔽中断3 M1 [% } O$ Z2 i
U$ }3 p) ~ b+ B5 U2 |% Y
2 X6 H. ]; u5 ?7 {: YSET_DATA_ADDR_START: ;设置复制起始地址
8 D+ t; ]! s9 v j- A# M* B LDA ADDR_BEGIN
, _ x0 D% w5 k G! ?" n) K STA ADDR_FROM_START ;设置复制起始地址低位5 M+ [& d+ R2 h
LDA ADDR_BEGIN+1- _1 J" y3 j% H1 q5 P% g `9 t
STA ADDR_FROM_START+1 ;设置复制起始地址高位
" g% O7 ~: Y) E % O* M+ i0 d: j( `" |+ m/ a- w
SET_DATA_ADDR_END: ;设置复制结束地址
7 o$ U- l9 s; ?0 R- g LDA ADDR_END4 x; E3 _9 L. P& V$ X
STA ADDR_FROM_END ;设置复制结束地址低位+ j" X# k4 H5 J$ M$ m, z+ V
LDA ADDR_END+1# k) v: P7 Q/ l' W" O
STA ADDR_FROM_END+1 ;设置复制结束地址高位* h% z, F8 Y9 Y7 K# b u3 c) r5 ]% ?% Q
- z0 Z- n- |! D ?+ R1 N" Q1 qSET_DATA_COPY_START: ;设置目的起始地址
- {' T4 f( s- b0 D1 b1 ` LDA ADDR_TO
- ?7 ?: v. P$ Z" Q& _& {+ a STA ADDR_DATA_TO ;设置目的起始地址低位* W8 R* M* \. E+ v
LDA ADDR_TO+11 L( D2 {; \" A( ]+ d" y5 _
STA ADDR_DATA_TO+1 ;设置目的起始地址高位
" k' \% g. C0 q. i$ P$ [! [ & _, J' d. k9 S& A$ U1 r
OVER_COPY_CMP: ;复制完成比较; v+ j6 v! e p8 i5 o& @# W
LDA FLAG_OVER
; {8 y' J" p: ~% s; X$ A$ l1 ~ CMP #$FE ;复制完成标志比较- W+ Q5 w/ L" @* y) s* j
BEQ DATA_COPY_EXACT
. O7 A7 W) V2 w0 p Q s; L( Y3 T" A& D$ O! R6 }
INI_XY_COUNT: ;计数器初始化
0 Z4 C. _7 n, h; I LDX #$00% R( ]) J( C5 N8 A
LDY #$00 t; g" }* p z" n; p0 F
4 Q5 Q6 i6 r- i$ _: X7 r
COPY_OVER_CMP: ;地址比较5 k4 A% Y9 z" G* M6 L7 }, k ^
LDA ADDR_FROM_START$ @0 t6 }1 c$ a0 R
CMP ADDR_FROM_END
/ `/ U, q, L0 ~ BNE COPY_START
( v1 n5 w* L; ~ LDA ADDR_FROM_START+17 {- {* Z, ^. n' _/ D" V
CMP ADDR_FROM_END+1# p% Z' {/ }7 I; j: K! V; r9 m- M2 O* p
BEQ COPY_OVER
4 q9 r, x/ K+ L/ [& i7 S6 y 1 ]( E8 S1 Z/ X) D
COPY_START: ;数据复制开始: i5 R6 M" S7 X+ h) Y/ H
LDA (ADDR_FROM_START),Y ;读取源地址
$ m$ ~& a, M/ {' U& L- h STA (ADDR_DATA_TO),Y ;写入目的地址6 z0 i3 W: x! M' r' a: @* D5 z" `, ^
INC ADDR_FROM_START ;源地址低位递增2 x; B6 M( l' Q2 N! n' l9 ~$ ^
INC ADDR_DATA_TO ;目的地址低位递增
" i& [( M4 t- x9 q$ s BNE COPY_JMP* O, v: m7 V* u0 [9 C* {
INC ADDR_FROM_START+1 ;源地址高位递增+ |7 c/ f& l- o* p$ n* ]$ H: h
INC ADDR_DATA_TO+1 ;目的地址高位递增
2 S* i1 K$ i+ B1 y: c: a
! [5 M. H+ n1 w4 b) aCOPY_JMP:
" a0 u% C; D: E: v4 T JMP COPY_OVER_CMP3 ]6 t! J. b, a3 N) I/ B, K" K& ^
o3 l2 s$ ^5 r, x1 z$ fCOPY_OVER: ;复制完成
. U+ L2 g0 e: p3 y N7 c LDA #$FE5 s* F( W; s" X8 R0 J! G' B
STA FLAG_OVER ;写入完成标志
7 H8 q% z' N$ IFINAL_BYTE:3 e1 [6 h2 S8 @. R }
LDA (ADDR_FROM_START),Y ;读取最后一个字节
4 G0 }0 w; X3 F0 _ STA (ADDR_DATA_TO),Y ;写入最后一个字节2 Y- q7 O' X7 I, C0 n; Z% \
$ J4 b4 Q" J) I. PDATA_COPY_EXACT: ;恢复数据
8 {- ]4 S( P# z LDA INT_ADDR5 ~% d, n7 Y4 A! q/ S' C, ~1 w c2 u
STA $2000 ;恢复中断% v0 P4 y3 I* s, ]% I7 l; k, K
PLA' l% ^* _4 \& Y6 U( ^
STA ADDR_FROM_END+1
* q/ J/ T: Y& }2 U( ] e PLA
! X6 s0 h c$ L, ?0 y STA ADDR_FROM_END1 J' H5 a, n Z( a! ~2 ^2 j$ g4 M
PLA- \9 j0 I7 _) U& |8 G0 s
STA ADDR_FROM_START+1
: B) I1 b! C) _$ a( m; y' [. i; S PLA
" [1 {0 v3 T; F; p STA ADDR_FROM_START, v2 |8 N2 l! O+ M. |
PLA* v+ V( ^2 p& C; Y6 O$ {! z
STA ADDR_DATA_TO+1
# K( B* o; W. w3 w* o# L& z PLA9 p6 o# t, ?( D, _4 ~/ G7 S
STA ADDR_DATA_TO* [* |& }) C+ b) v, a
PLA, N. B! ~; b( D9 z
TAY
8 k9 u3 ?2 z1 ^7 P PLA! b' f" N8 m& `8 A
TAX
* y% Z8 }% _: r% A+ d/ ~4 c PLA+ f& }) c1 Z$ t2 g. X1 z& K
PLP9 L6 @9 p' Z5 B5 |9 K
; [# U1 P- T: N, F! C
+ h$ D7 Q1 e4 t0 G# o& x & b9 N B7 l) r9 k: t
DATA_COPY_RETURN:6 ~( ]( Y5 C `! R- x
RTS
+ }: @8 u* ]9 E - q6 ~* r" L# W" J) {* W
.ORG $C056 ;精灵指令覆盖
5 i1 p- G @9 Q. h( }6 } JSR $FFB5 g6 a l3 f0 {6 V* U; [
7 d( E5 A& P$ V, k! i
.ORG $FFB5 ;
0 q/ V0 l( [: W Q+ H$ r% M- B PHA, }' X! M$ b, [1 [/ v( }% R, E
TXA
) X6 }; i' D; Q% x PHA
/ {5 L' m) { `) i& O TYA4 D- K3 J+ y7 X' F
PHA
8 e5 {% `; M: X5 y8 S LDA $71FF ;比较7000-71FE数据是否完成复制5 G' |4 @7 y7 G; m# Q) P
CMP #$FE
' z1 b4 w& @5 r" b BNE ADDR_FFCA
4 B: b8 y$ M! H PLA
- o/ K2 ]5 w0 B, ^3 {5 W' _ TAY( }& { L8 T8 e2 N' C) f& m
PLA
, ~8 W) M+ |: F( m TAX
& r: ?6 y6 H' \, D! n' ?. [1 h2 ~, g PLA
M1 Q6 ^' s* |* b JSR $7000 ;跳转到自写程序
& b# R; C( x* W/ O; m% E RTS
5 o* c, S4 f, I0 `% AADDR_FFCA:
& T8 G$ D$ D" O PLA% G" K1 N/ i3 s/ P1 l m* l1 g8 A% ]5 u
TAY
$ A' |+ `4 Z+ H% N3 J PLA
5 q! p+ D1 G) X9 s" c5 Y& Z TAX
u$ `& |3 q' ~9 N0 W PLA
$ s; j& ] l3 A0 c- j; B# h RTS
) e4 h5 @: |1 |0 D9 ?' Z, @# B
# w# l4 C$ C: r4 g ]( Z
* w4 ~# n3 [" F$ }/ d% B u5 c- Q) \' E8 w
.ORG $C264 ;自定义的MAPPER2切页程序
4 a8 i8 ?, j/ t4 t; M) l8 a PHA9 X! g" x' `7 X' x6 ~
TXA
6 u, X; O4 I, T+ J& a PHA. u0 E% f9 R3 J& h: d, b
LDA $00660 J! ^" v3 i6 {& q, S0 ^* F; h. c
BNE ADDRC280' m8 p+ T2 U5 D* J" z ^2 t
LDA #$07; Z: n& v& ^( ~9 h- ]
LDX #$03
, I' W3 C( `0 F JSR $CD9B ;自带的切bank方法) `! ?7 P& T2 h! c
PLA
% m3 ]' R) l2 ~. h( B5 R: @ TAX1 @$ S" M3 r! W: f
PLA0 b7 s; p) B" ]. s9 x7 ]
JSR $80007 E( r/ O2 U' f! d
LDA #$06% W7 Z6 k, v D/ n% ?$ b9 v7 S
LDX #$03. }, K! Q( U! @0 N R
JSR $CD9B ;切回原该切得bank(可以不用)# N! z) @! ]3 \. H8 Y' h8 g. l' T
RTS
8 t ^- Z( x' N2 _( Y1 rADDRC280:
8 M. y* \8 u' a2 U PLA
! u! q! q& Z2 p TAX
( O) q* p& m# V$ v4 s PLA
H, i5 X8 I. @9 i* w. D RTS8 D8 t Y4 K. X) t3 n( h
2 R* O4 R! @0 ?3 t, \& q
0 j4 B3 b5 S. V) m5 I9 V' |( T, L;[FC][最终任务PPU][END]- v2 ?* x2 H9 ^' ~/ v! ?
.ORG $C056 ;跳转到PPU重写程序: u) Z5 z4 K2 `
JSR $7000. r9 a4 d0 W% K& Z9 v2 f
: a; y' H S; F
.ORG $CEBF
1 m( V& Z# @# J8 p) |! b JSR STAGE_DATA_WRITE ;跳转到关卡数据写入6 o/ h! K" J' R" N/ e# @+ E
9 ~' h- L" u& @: l4 ?2 m' \ .ORG $E460 `/ X" v& q& n- P9 K8 l6 t7 w# N
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入( l4 _; c7 z1 y" I+ x. Z* W5 v
1 ?, s3 u5 _* o! b# X; T! O
.ORG $71F0# h8 q" Q. C4 y
STAGE_DATA_WRITE:: ~% R7 ~( Q3 j! z% E
LDA $60107 Z1 ~1 T9 U8 J" e3 D
STA $1E ;关卡写入
* [, ]4 W3 j1 p9 z LDA #$00# \, o# w/ S5 L* W
RTS
5 ~* _3 F. m8 n; r .ORG $71C0( X! h# B( T3 ?1 g8 l
BULLET_DATA_WRITE: ;副武器数据写入. c% t& R u- w A7 H5 O
CPX #$0E0 _* W+ {" _$ x, d e
BCS P2_BUL+ {8 p: b# J0 G( r/ r2 Z
P1_BUL:
5 @* ^5 s7 o4 A5 t LDA $6004
" S. D) T* ^0 Y6 s" F$ p JSR $D7D0 ;P1副武器数据写入9 [5 d$ h0 p+ ?1 E/ P0 R) ~5 Z
RTS
0 S. M4 K) v4 O& `. G0 SP2_BUL:
1 P( l9 Y* N9 L1 [! i LDA $6005
) l5 M6 h3 t* l ?& [1 j% k JSR $D7D0 ;P2副武器数据写入- t+ U2 k9 P* }5 Y
RTS% k' B6 J7 k# s, r/ I
{9 I. |5 F& p( d4 a- @% I
5 s5 R* S8 [1 d4 u# `+ h .ORG $7000) j7 o) b) K( d' ^$ V- v z6 ~; L+ A
% O6 n+ U" @+ p0 q" q1 a STY $4014 ;补上覆盖的精灵写入指令# u6 Z. R) { A
PHA- D: x( O) m6 b
TXA) U1 E/ Q O& _* B/ Y) t' A$ Z0 F
PHA* ~6 K' k! \1 M' I8 T# n5 m0 o
TYA
7 j; ~* z0 W& t" y PHA
% t; ~$ a$ u3 j. p5 T( p LDA $0C5 A! g" P/ v& @: w. q- a n
CMP #$01 ;比较是否为标题画面# S# ?' }3 d. }- O
BEQ PPU_STAGE3 D- ?+ O( \" o! D
PLA
2 k0 M. d( ~' V: \% W TAY4 d9 Y% Q" h+ c: e7 B- c, @
PLA: `. L2 j& [% ~ }4 ?0 ~# F
TAX) F; M4 N1 ^) y: F. e! m
PLA
- O! x9 m5 `. b RTS
y/ C- R" [ J c" u& F1 yPPU_STAGE: ;STAGE显示程序: d' F/ L. N, w1 q; e' d. F3 H
LDA PPU_ADDR_DATA
, x( W1 W, a) G) X STA $2006
; e/ Q7 a5 @( `. }* ^8 k; j2 q LDA PPU_ADDR_DATA+1* S, x* X0 D5 a! h
STA $2006 ;坐标设置
" a8 q/ j8 R; I# n LDX #$00
& t$ u+ u" r. E* G% |2 K8 v! hPPU_STAGE_WROTE: ;写入STAGE字模
/ B4 ?9 C- j6 ]9 A LDA STAGE_DATA,X
) F' |7 x3 @; j4 I+ X STA $2007' g5 u+ v6 s% ]& I
INX
; i; y& {- p& ~ CPX #$06
+ V) b. v/ ]1 r( M. ` BCC PPU_STAGE_WROTE8 P# s5 z B0 U# U- h
LDA $6010. V! B' q- x# U1 y1 c/ v- a# J
CMP #$FF ;关卡数据初始化条件判断0 ~$ P E/ W* ^; z) Q) K7 `, a2 A
BNE KEY_B
( j+ X6 e, G( R$ B2 F" R2 j LDA #$00
5 |' h+ G2 E& ?, D STA $6010 ;关卡数据初始化4 o$ I/ l+ ^( r6 X
KEY_B: ;关卡减少$ O9 k4 B0 U: ?! H4 I
LDA $04: P" C4 j6 M% ^* O+ Q* z0 |; `
AND #$42 ;按键B或左减关1 b& X7 {/ Q8 @% R0 }# h
BEQ KEY_A
" X2 t9 A1 c, U& l% ~6 c LDA $6010
5 E, e! [6 g/ H CMP #$00 ;关卡比较
* P1 ?( w; R2 h& ^' j: X* u* s BEQ KEY_A
- y& _: W3 w {+ O DEC $6010 ;减关 G! N1 q9 ^1 y7 e( b: U
KEY_A: ;关卡增加
7 j7 K6 g& e$ L g LDA $04% Y* s7 {) Y" ]: f# Y1 w: I: D
AND #$81 ;按键A或右加关
) `% r: W, l' J& x+ v" E BEQ PPU_NUM_WRITE
5 F' ]7 |# x! ]9 g) @0 t LDA $60109 V3 }9 b; d: n5 A
CMP #$04 ;关卡比较$ T8 q0 e; [+ y; C6 c/ R7 U" m
BEQ PPU_NUM_WRITE
+ v# p7 l4 M; }0 ~ INC $6010 ;加关
, @- J4 E$ D+ Z2 X$ I pPPU_NUM_WRITE:3 y9 W% {( S8 C5 R" f" T
LDA $6010/ G# x5 s+ d2 R9 v0 C m
TAX0 H. ^* U/ u& E q- R
LDA STAGE_NUM,X ;写入数字/ o' Z" }1 u# w! O# o9 L2 a
STA $2007
% Q- t. I' R% A, i& }# jPPU_RTS:
9 ]3 p* P2 B ]0 A8 p* m* i PLA9 `3 P% S' | y; A4 _: \0 i7 _* B
TAY
+ g/ a+ |$ o9 k8 ^# T' @9 H" J PLA
" f% v% V% \/ E- }( b$ h5 C1 | m TAX. B+ j1 |! X( x+ A. f3 p+ Z* }9 d0 s; z
PLA9 _4 j* q7 s: l$ |4 `" M" {* G/ j0 j
RTS: j5 M4 B1 m) u. n
% U& \; F# c9 ]% [/ ^
% X$ N* b. R6 s8 v+ lSTAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
/ j8 O: `/ m* f* k* _ .BYTE $EC,$ED,$DA,$E0,$DE,00# M. b" q$ c7 F# J% i
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据8 P" }! |) A' D( p* ^
.BYTE $D1,$D2,$D3,$D4,$D5
6 l3 ?$ A; J6 r; {1 Z ( |$ X- W+ O. e# H0 o
PPU_ADDR_DATA:
1 f. \: P1 K8 L; Y4 Y .BYTE $23,$0C7 Q8 F& W. I% ?$ z* Z
$ x! N& ~5 X: } |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|