|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
1 X2 l1 s: E1 X' V4 e8 } P
* W6 R8 s0 Y8 R$ f得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.* H7 a- w. l% A
然而,今天想到一个思路.. `; l# i n0 s7 M: a
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
: h4 v1 J, F) i4 N5 \2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
) q: d6 Q8 w9 t! S+ @1 u2 c/ {3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).! X8 ]1 v' |4 h+ n0 q6 h1 h
" ?5 W9 ?2 |$ Y4 z' ?) j0 V1 ?
0 J+ x- f4 h% |1 b" N8 s ?1 `) P2 P;[FC][最终任务KEY][END]
' C7 G, f$ R- z" X; f# V4 abutton = $04 ;单次按键# F: }& T; F) b
flag = $6000 ;功能开关标志& x1 j& \' k p- N2 Z
pause = $000E ;暂停地址
, l/ {8 y2 Y' M3 Z) i
1 `0 `1 [5 c- h .ORG $80002 t j9 D* w# \
LDY #$08 ;自带的按键程序! ~* A( |9 g- C- ^1 u
ADDR8002:
% l* b/ Z2 \/ \) p7 G* ^+ s LDA $4016,X o* c5 g$ n. Q' a! w( C
LSR
2 e! I4 i" X4 _ Z8 z8 ? t# ` ROL $0021' U1 }& w- K. p* {
LSR' U9 |6 `7 T, A! g
ROL $0029
+ T. q. ^1 `3 [7 v9 K4 e DEY" c5 l' D& T$ G, A' o
BNE $8002
$ J+ A' ]5 J, C6 e$ @ LDA $0021
! q# D5 y, s) h; [3 E( `0 H+ _7 e ORA $0029& P7 G7 u% \4 w/ ?3 O1 ^
STA $0021
2 k, D6 p* N+ B j$ A7 Y LDA $0020
1 O' C7 M& c" H1 x3 V# B4 \( O AND $0021
- M, u/ L; \, ^- z STA $0020
, G5 X/ i& w) o LDA $06,X
0 o% U, R4 h- z) F EOR $00203 b7 f1 \5 A# t$ n3 [
AND $0020
; w/ K& E8 x+ t: J2 ^; ]) `0 x( _ STA $04,X
/ d5 m" \8 D v# c" | LDA $00205 ]2 a h7 M5 W$ M5 w
STA $06,X. x6 P1 k7 |+ C. J% Z$ c7 S- Y+ P
JSR KEY_OPERATE
" \0 x& o: V; R0 l; _1 u2 j JSR Function ;功能调用
: Q2 A# Z& f8 e( O M JSR Weapon ;武器切换调用9 t! l) Z/ G, [7 h
JSR Power ;威力调用! b4 _+ ?: F- i# D/ n! d8 q4 Z" I
JSR BULLET_NUM ;子弹数目
4 k1 E* a" S+ B4 s2 @9 p# G JSR BULLET ;副武器类型4 N0 R! w2 F% \6 U. v
RTS) u0 [9 L3 X- C* d8 O' O
Z R% }. r3 v: f
. [. F) {" u8 z
6 U& r6 s$ i# s) c$ U- D/ U .ORG $8050
5 Z% T, n! x R. I8 o( wFunction: ;功能7 R3 j1 T! W& ?0 M5 e
WUDI: ;无敌
) d8 K( m: `- r' ^; @ LDA $6000,X8 M. s( C o2 u( X
AND #$08 ;开关判断5 I+ I7 V# d% U
BEQ LIFE
4 V& V. H2 V" y+ Q; }2 m LDA #$05- c7 v! L2 ^) \5 H" ?, o) A* R
STA $05DC,X ;无敌锁定" w; j5 L6 I- Q& `
LIFE: ;生命
2 T, k$ w; z* R, K$ ?2 O LDA $6000,X+ E3 t% f; X1 x& X, K$ Z% ^- C9 Q
AND #$04 ;开关判断& T7 J0 A( P' h! I: M8 n- V6 L2 u
BEQ FUNRTS
+ N/ ?0 W) @( [ LDA #$05" ^ X9 ^* E' S+ O' C& Z! `* ^# q
STA $1C,X ;生命赋值" c9 g$ j4 }% @ [) j
FUNRTS:
8 Y9 u0 L( q- O+ b! a# `" d" v RTS8 L& S8 v* ?. X/ c% r2 C+ ~: b
) ?7 f9 M7 M0 H/ [6 JWeapon: ;武器切换
& z+ B( l% y6 ` {3 h! x LDA pause ;暂停状态判断
s) l+ o+ u6 l BNE WEARTS9 x! O7 {9 @/ ~' Z: s
LDA $04,X6 X" \' e- m) r2 m) n4 |
CMP #$20 ;选择键判断
+ s! v# `, I$ [4 H# p BNE WEARTS
2 }& W! o% y1 p& y! c$ P! B8 i LDA $12,X* l4 {" B1 @# I0 y8 H/ |
CMP #$03 ;武器值判断
4 }+ Z% ^8 Y8 F, y N, C" [% t BCC WEAINC
# l& u9 W4 z+ t! m* h+ U8 _3 x% j% q8 N LDA #$FF
( A# y3 U7 p, O0 k STA $12,X ;武器重置
- L+ i0 S1 P" y% L: j. R" k1 GWEAINC:( y: H9 \+ R. b g7 X2 Q
INC $12,X ;武器增加
7 I9 L# b% O- y
5 U; c' N- n$ v; mWEARTS:/ I' B8 k. Q. H' e% o
RTS
. U( s! X) y1 U1 ]5 b- I) y8 B. T3 I
8 C% ?, t: w. Y X" i; j+ DPower: ;威力
2 x* T, k/ p- z+ ` LDA pause ;暂停状态判断1 H2 K! G$ d. g9 D, ^
BEQ SPERTS
4 E+ s7 A! h( }$ Z" E: c4 f% GBUT_LEFT:
* f- U. c, L/ ]0 v( X LDA $04,X& G9 `1 A. w0 K& A
CMP #$02 ;左按键判断4 ]* U0 L O j: P! C
BNE BUT_RIGHT
) M# j+ N( ~. b' X" j LDA $88,X+ x. n' p# D& C" n. y* q. D2 G
CMP #$00 ;威力判断! t# r- f1 b$ q# r( {- F& t
BEQ SPERTS
* s- C0 k/ g; w* c: b5 XSPEDEC
+ }$ o" ^* b. y# a8 K LDA $88,X ;读取武器值" z! Q# I6 o$ ], K. h' n# d0 m9 T
SEC
2 t5 [+ Q# s3 z* J( I0 O- w SBC #$084 X. A- [, @+ w# \" G" M5 k" a
STA $88,X ;威力减小
% ?) x3 y! H. l. N9 d! ^ }5 KBUT_RIGHT:5 B. N1 W5 B( m% P% ~# e, D9 l2 ~
LDA $04,X4 n' b: z. ]. ?9 i
CMP #$01 ;右按键判断5 j: v# I5 Z1 o" A
BNE SPERTS
x3 c: C# ]% [+ e/ w7 v: f LDA $88,X: p. `% d* E! x/ q d: p
CMP #$10 ;威力判断6 T" u% ^, b' o
BEQ SPERTS# Q1 B. x/ x( b. w, j. |% N/ `
SPEINC:- P1 E H' g" W, i o8 W# z
LDA $88,X ;读取武器值
4 ^9 Y: | A, c% v7 j/ b8 d CLC
3 Q2 @! _* \" F. f" B ADC #$080 C, `3 l4 C0 z3 Z3 n' u
STA $88,X ;威力增大4 f% O6 @/ }3 c3 N
0 z, s5 i& F5 [! e7 G5 W: E- ~
SPERTS:3 g3 G" p, a% G6 K% H2 Y2 G
RTS
; o; e: X) R9 D5 I$ _8 v1 O+ I, G1 V. P6 _; e/ O/ z
BULLET_NUM: ;子弹数目& T& M$ X2 W! h. d: x
LDA pause ;暂停状态判断
/ v& d8 }. }4 g/ X+ p) Z BEQ BULRTS
+ F/ m# u) \8 \1 B CPX #$00 ;主机玩家判断
* ~; l. a; g+ }7 u# ^- j4 o BNE BULRTS3 k! g; w. m& g2 J
LDA $04,X ;主机玩家判断 m# u" ]1 W7 T7 j; @0 I9 x
AND #$80 ;按键A比较" s& l% N( \* q4 H. N1 {
BEQ BULRTS/ n3 ?' x, m1 X9 _- _
LDA $87 ;状态判断
& E; A6 V% w. p& P9 ~ BEQ BUL_2& d$ M* y1 S, r/ Q0 O, s
BUL_1:
" I% s. y+ c! H! S LDA #$00! \3 i% h/ e& b T
STA $87 ;1发子弹
) p! {5 h8 g- C4 k5 D6 ^ BEQ BULRTS& o H$ H5 ]4 f! s! ^5 {2 d5 Q
BUL_2:; _! F3 V5 T: _* A% k/ o/ V% L! y
LDA #$01
7 Z% P- ]& e0 W8 m+ P/ n STA $87 ;2发子弹9 N1 a5 w' v4 K9 s# V6 t7 ~, O% J
# h3 a( Y' j+ d- i4 L( V
BULRTS: H# F/ h) m1 h" t
RTS
$ k( a6 _- H w% r6 L! X # W/ X2 S; S: f% _
& ~7 W) R& C6 K' p
BULLET:5 X) l) |( t4 q O; |8 \# j. A u9 \
LDA pause ;判断暂停状态
2 d3 @2 o6 U8 G: ?+ w3 ] BEQ BULLETRTS
E/ P) u. T5 x3 A2 `" R& I LDA $04,X2 y* _ |, T& e, O
CMP #$40 ;按键B比较
% o+ A; ], f1 u: G& d BNE BULLETRTS6 o1 ]1 ]7 w# L( r8 U# }
LDA $6002,X ;读取副武器
9 v2 R) s3 a, B CMP #$03
5 f" O l3 c+ b# s BCC BULLETADD6 M$ Z4 A t7 e; s" i. F" c ~2 ]" A
LDA #$FF2 p$ a/ j4 w& B
STA $6002,X
9 c! N1 O; d( D7 V4 `BULLETADD:
# E3 F1 `5 D! \. c" x$ ~7 a INC $6002,X
4 U; j4 S4 F1 G
) z( ]1 C) g8 |: O5 h! YBULLETRTS:% w' z: K, x/ x H; t) g
LDA $6002,X( ~# e& F3 l6 ~7 j, }- J
TAY
6 ^6 p, i9 ^! x& N LDA BULLET_DATA,Y
% M3 M# ^+ l/ P- g" D2 H STA $6004,X ;写入副武器数据- |) s7 u' h, J7 z- G- K# T$ ]: t
RTS# ` ]3 }2 w4 I; y3 K: Z: L. a% c$ r
' b5 F4 n2 q, ^7 [ # P% }1 a( y' X; m- w& ?/ N
BULLET_DATA:
$ t- L& b3 r* t' D: ^8 f8 Q1 U6 u .BYTE $06,$02,$03,$04, o) S* \& \& B e3 L( @% n# l
' u, M$ b! ~, W
2 Z1 S2 e9 x- f9 k: n$ m # |9 P2 j# |0 _1 i1 i) P/ c
KEY_OPERATE: ;按键开关操作6 I8 }/ d; @% B7 N {
data_protect: ;数据保护5 L; P. a+ I8 i, q3 R$ t! }
PHA, O& l( }/ B) c7 g/ Z6 }/ _
TXA
" B0 S+ I/ a. O, w; k PHA
2 l: @; R; S; C1 b: r TYA
* b; D( ^- G! V% Y. \& Q$ C/ ?0 E PHA
; l8 [2 a: _! t% R9 r% [/ f+ W; W: R& ~8 {3 l, s
FLAG_INI: ;开关标志初始化" s; _" x: V$ u9 d, q2 o& N; Y$ G
0 y& O3 v8 J. W! m* _& E& @5 a# I
LDA $600F9 S- }" n; K7 {3 I6 N: b% J; r
CMP #$01
# }* Y. j+ D m/ _; S8 t' n: t BEQ pause_cmp
) R# N$ x4 t0 r3 V1 V, u% g LDA #$000 f% {7 d! F' H
STA $6000- h8 _3 z, `+ M) Y) ?# |
STA $60013 ~& y7 c0 q. W
STA $6002
$ ?; J# k" Y& k3 C1 I. Q; o% f STA $6003# P: u2 @! j7 h$ ~6 Q G
STA $6004
" |4 a* B6 f. F2 f1 m$ m STA $6005
0 R; u1 [+ n% u/ D* [& I LDA #$01
' s$ y5 z; T3 T& K! c STA $600F6 w" C6 e$ z) j4 c7 w2 d
5 K! [5 G' z% y( zpause_cmp: ;判断暂停状态8 J m# K" R) |) l' h" j! Y
LDA pause! {, j& l( C: x5 b
CMP #$01 ;判断暂停状态. S3 @7 A" x+ S$ v8 s) o3 @0 C
BEQ button_press
# Y0 E0 h* a5 f PLA+ J9 [0 V; S w4 d. W+ [
TAY
- @3 A; E* ^5 \7 G6 C( D1 B; G PLA+ W2 j) M! L: X& b
TAX
5 W" r P+ I d6 P% F; m" M0 M PLA
; E0 |" A- C( q- B/ L' ]3 i RTS
; Y5 n5 b0 k' N) Y( ]7 B- R' M( _5 X# |# U$ G$ u% z2 }' w
button_press: ;按压操作
1 ]7 V }8 \4 E, C* Sini_Y:
) Z* l' m, n! P/ m- J) X7 D" [ LDY #$00
; p9 R1 u- x) [6 T2 T: Y; V2 lbutton_cmp:
* s4 w& Q; s! K0 U LDA button,X3 h& o- r0 A5 m& L- Y% ]' O
CMP ora_data,Y
& [. p5 j% S$ [: j# v; H! g e. G BNE count_Y_cmp
7 J, N% M( t7 ]1 e) _$ R1 Wflag_cmp:* b- C$ s$ _' c7 h6 z8 ~
LDA flag,X
- Z3 E2 M( H+ Z8 `5 P AND ora_data,Y
% A& w" o) C+ }! `+ W BNE flag_and
# ?' o) K3 i/ U9 V: J: _& Bflag_ora:
\6 u' s) e2 @$ D LDA flag,X
- w4 \, [2 t2 l$ h& [3 f/ V5 h3 c! t ORA ora_data,Y6 v% ^! X# h+ B5 s' S
STA flag,X' b9 M4 H# c0 W/ d# X" n
BNE count_Y_cmp. |' s3 y. V& Z% v4 M/ w* s4 f9 |
flag_and:
9 H; S5 t c7 C9 G* F8 P- f LDA flag,X$ d0 ] w$ b8 @
AND and_data,Y, b6 t& K1 R( }0 E& b! h3 J
STA flag,X$ o G+ O, f, u8 \9 A
count_Y_cmp:) D. j3 M- q: A9 l/ L4 L
INY" X8 b/ s/ P. B# t }, U
CPY #$082 S7 o& {; i7 T& k/ f
BCC button_cmp
4 Z; D2 D- V: `
- q; k1 E2 u! {& Q6 Mdata_extract: ;数据恢复" O1 }' G7 T% t ~- B) e; P& X
PLA$ A6 Z! T. ]2 o( e
TAY2 H. B" C% y) `# x# a( Z3 B
PLA9 R. k+ [$ z8 q! Q/ x4 r9 L% y
TAX2 V7 }3 B1 |3 c5 A$ T: K6 H
PLA4 b0 ^. n6 K7 d6 `6 V
- w: f' T: I8 W. B
return:% o- m1 D" X: M
RTS
( z# F* N$ |# d4 R8 ~
2 a, L K% a: f9 e# Z* kora_data: ;按键相或数据! ^ s7 D* A8 Q7 C/ l0 ?
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
3 o: x6 c8 M2 c1 eand_data: ;按键相与数据/ h# q8 e: H7 d" b* k' }
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
5 ~* V6 e$ \* c$ K' J& v
8 f- {$ f) z7 K7 @& R: g + `, k6 o# [$ M2 O
! @. x9 q( @" F; e- J9 I ;FC数据搬移程序 BY FlameCyclone* _$ ~- W4 O1 s/ a' B
.ORG $82004 r9 b; z' Z2 I8 O" ^4 i
JMP DATA_COPY_PROTECT
) o7 o0 Z7 K% A0 ~4 F
* ]5 ?- @. I6 Q& [* [ADDR_DATA_TO = $40 ;目的地址
- U# K/ D7 c6 D! c9 W, f% `( zADDR_FROM_START = $42 ;源开始地址
( u; O# M' Q) [3 @# S" JADDR_FROM_END = $44 ;源结束地址
3 W0 V% L8 D, Q
' O- r k5 Y5 Q; |! p' R' g; E- OADDR_TO: ;目的地址 M7 n {2 H' B9 p3 \ o' _( u" A
.BYTE $00,$70) c& t9 l. X" u" k
ADDR_BEGIN: ;源开始地址
3 v. Y- U8 s/ I# o9 I4 u- B .BYTE $00,$83
5 Z, U8 [3 Y3 Z6 C1 @2 l/ s* {ADDR_END: ;源结束地址8 e- ~: e5 ]/ g* M2 X
.BYTE $FE,$84. A8 B/ G) x6 [7 ^$ p/ y
- D8 m% D9 }3 `, L% t6 F# pINT_ADDR = $08 ;中断地址$ h2 J3 q& e" C! n3 N8 x6 @
FLAG_OVER = $71FF ;完成标志1 w/ z3 [: B$ t4 u7 Y5 W
6 _/ w+ P$ u* g( r4 Y/ i3 f
* ]' f( O9 Z" p; W4 I5 |7 C* D( N# ^
DATA_COPY_PROTECT: ;保护数据
/ }' k, d/ w( i8 M$ c4 v PHP
+ R& `% u9 J( c; |* H. l6 q PHA
# {# ^/ s8 n: l TXA
0 K0 E& ~4 P! W- n8 t7 W. i# @ PHA
$ C9 d: N6 X$ S) S% l, Q TYA
/ n* r+ `1 _3 a, n PHA
: e3 r& C* J7 c LDA ADDR_DATA_TO
* ~9 P" _) N0 Z" G0 a5 l0 B8 I PHA
& V5 g3 r, k2 v; F. C# C LDA ADDR_DATA_TO+1
2 A4 `9 Y2 s! l PHA
! G" o Y/ g0 j/ c" c( R- P LDA ADDR_FROM_START
7 x; I+ p0 H0 K% d" v' R PHA! v$ i/ s# b( M( e6 I# m3 j
LDA ADDR_FROM_START+1
- b% q! r+ J0 i% C PHA
2 L: g7 u8 k; B) o' I3 X% v" a LDA ADDR_FROM_END
+ W# R0 o: p5 ^! G+ X! D PHA4 w, }+ U; n. B; ?; q. P$ [
LDA ADDR_FROM_END+1! K5 h+ ?, W9 \7 J; @
PHA, M; A- s8 [5 `7 |2 y- Z- ]
_1 f; e/ z7 v5 Z* ^+ t" ?
OFF_INT: ;屏蔽中断
$ f5 H4 B2 x- \1 B/ H$ x LDA INT_ADDR
4 P. m/ R) I7 V$ R AND #$7F- m' ~5 ^- u, d, l! e
STA $2000 ;屏蔽中断
! L% |; I# j0 f; C! E; ^' J% U5 G, X& a) ~. P9 Y1 E! Z
& q ?, r( N- w+ e6 T" N8 J- ]SET_DATA_ADDR_START: ;设置复制起始地址
! z9 J1 e \. C, R! I% n8 f8 R LDA ADDR_BEGIN
+ W0 g$ C: V4 G, f' V7 g2 u/ X STA ADDR_FROM_START ;设置复制起始地址低位
* a) [8 X4 T# z- \ LDA ADDR_BEGIN+1
8 y) @# Q2 Z9 r) q: S5 W STA ADDR_FROM_START+1 ;设置复制起始地址高位2 `: L2 y( w8 M$ c( {( Q
' ~- `) Z6 t' V" W9 jSET_DATA_ADDR_END: ;设置复制结束地址8 e/ o9 q: D! @3 Y2 y \ m. B
LDA ADDR_END5 x) b3 a3 R R2 c" F
STA ADDR_FROM_END ;设置复制结束地址低位3 X' \8 }+ m) `8 e' h# I
LDA ADDR_END+1
6 n8 @5 X3 S2 \/ B4 x# b d STA ADDR_FROM_END+1 ;设置复制结束地址高位, B; ^$ v/ }% p, D; o, d& }5 M% S
* i- B3 r, a% t
SET_DATA_COPY_START: ;设置目的起始地址0 X* b' K+ G/ R4 c8 h! b& J
LDA ADDR_TO
+ ~6 y2 P' W; ? O2 S, | STA ADDR_DATA_TO ;设置目的起始地址低位
0 X4 o3 s- C) z+ C# Y* F LDA ADDR_TO+1" O* E8 g, m# H$ B n& T
STA ADDR_DATA_TO+1 ;设置目的起始地址高位
, w4 N" j: V X# t3 ]0 F
# g1 J9 c0 T" l9 hOVER_COPY_CMP: ;复制完成比较
' @, e2 F( H5 @6 J LDA FLAG_OVER
* Q; Z( Z* z1 F/ o CMP #$FE ;复制完成标志比较' y2 f5 r5 `. J, u* l
BEQ DATA_COPY_EXACT
( l I3 B, Q" I6 s0 Z( H
9 S% X5 v4 |0 g* a# Q/ N9 hINI_XY_COUNT: ;计数器初始化$ M( G( X9 h+ Q3 Q* C
LDX #$00
, A) D$ y _0 w% @ h: ? LDY #$00
% e2 |# ^- ?3 M: Q1 X. C" t* `; k 8 l. c/ O: _& p' J$ h: ~
COPY_OVER_CMP: ;地址比较$ a5 `+ K; ]# c$ y, V
LDA ADDR_FROM_START9 a4 z9 h. c6 S' r' X ?
CMP ADDR_FROM_END: k; i! j, B+ u% U5 x0 ^# P
BNE COPY_START: b( n# P. \8 G, G) ~
LDA ADDR_FROM_START+12 a: m5 X! ?# K+ M
CMP ADDR_FROM_END+1
: S8 k# }- m% r8 W% M, B BEQ COPY_OVER
2 ?+ C2 o% F3 X1 T # |4 p2 @5 }! |( Y# s9 \6 Q
COPY_START: ;数据复制开始5 A! o8 p6 {0 I8 }' [
LDA (ADDR_FROM_START),Y ;读取源地址% h! G% f7 h% K3 P, S B
STA (ADDR_DATA_TO),Y ;写入目的地址
2 T' ?$ M: F8 Z, x6 e INC ADDR_FROM_START ;源地址低位递增
* r+ K$ T3 {) t% s INC ADDR_DATA_TO ;目的地址低位递增) r# D" \6 {( Q2 o: u
BNE COPY_JMP. T' d) A( q8 V# w Y; ?( q
INC ADDR_FROM_START+1 ;源地址高位递增) [ s# S$ Q, X3 |6 {7 ~$ c- ~
INC ADDR_DATA_TO+1 ;目的地址高位递增
) |# X- o, }3 U8 p/ ?8 D
# m6 y8 j2 N: x0 `( DCOPY_JMP: ) I0 Z1 c" W- \7 [8 y: S) ]" {8 f/ O
JMP COPY_OVER_CMP4 X. ` @7 Y/ w: h6 J3 `4 L
& g& t% S, a+ sCOPY_OVER: ;复制完成- L; M5 @1 ^6 M' a, J5 l. t
LDA #$FE& ]5 u d' X& l! M
STA FLAG_OVER ;写入完成标志' b, X) c# W3 Q& B: C
FINAL_BYTE:
7 E! m& R4 y9 W5 U$ W+ X) d LDA (ADDR_FROM_START),Y ;读取最后一个字节, {5 e. F. g2 n
STA (ADDR_DATA_TO),Y ;写入最后一个字节
1 ^' w% e0 n( J, G! N( |3 ` 5 R1 u# \2 d* f) @2 P; H4 K
DATA_COPY_EXACT: ;恢复数据
5 H* n- @# {. Z0 H8 v" q2 y) V: Y LDA INT_ADDR. M+ ^2 S5 c, b7 f
STA $2000 ;恢复中断
R7 e6 I- |" d6 W0 u6 [6 M m2 }% q PLA, N, B( z8 H5 J0 @
STA ADDR_FROM_END+1
' M- E3 n4 a2 I0 U& w PLA
3 ^" ^6 C+ L& n0 J! V- A STA ADDR_FROM_END g$ d( |$ R+ u. i
PLA
. W4 \2 ~: I; s; A( h STA ADDR_FROM_START+15 R3 f# Q( e; P4 b6 {' L6 x
PLA0 R6 {( X' d; R5 A& D% i/ j% s
STA ADDR_FROM_START
/ K0 [5 `( ^, j {5 G- U# n PLA
4 r; T9 u! _4 B0 a) [ STA ADDR_DATA_TO+1
( {: V8 C; T! \9 Y PLA
& T- Q8 f7 M6 P7 }" v) C9 \ STA ADDR_DATA_TO
- u* `" a2 G1 r1 G4 k/ ]$ r4 ^ PLA2 {6 v: y5 ~/ x R! W
TAY
/ u% R4 Z" c' \; A# |' z PLA
& o) l' h+ u6 c4 i' ? h TAX" p2 L& M8 K' k8 I( N( s% ]
PLA
1 q6 B& Z+ x) K8 s PLP
; E, N8 Y+ W/ A1 v9 c: b : {# ^: c( ^! Q- s$ Y* ?
7 w% I9 E. R# @7 }! N3 e) ?
2 p3 ^- s* N( n+ X. LDATA_COPY_RETURN:
M! A0 O6 K" `3 m4 L5 d1 b$ [" k- h2 j RTS, ?+ P- B4 B' I- P# E. [
0 F ?2 y9 [" f( C. k( h0 o .ORG $C056 ;精灵指令覆盖
l; p; c, o1 g; `2 Z" g7 C JSR $FFB5
' s& R6 h" j* P9 g/ ]" D
7 k5 Y3 E; n( K# c% ~. |4 g .ORG $FFB5 ;
1 y* Y0 s7 x( A: ^4 b PHA
u: z+ O2 y8 ] TXA
4 A7 P7 D6 ^% ]. X, s PHA
3 Q& K* y7 Q, ^& O3 f TYA
) e$ v: V8 |4 _* |3 D, b! `0 X PHA$ Z2 w6 e% ~2 x
LDA $71FF ;比较7000-71FE数据是否完成复制
) V1 H) j6 ]6 c) W/ d* F9 B% L8 F& B6 T+ | CMP #$FE
: `$ h$ L. f% ^, ]0 x8 }. M BNE ADDR_FFCA8 _6 P2 R$ Z9 y4 n
PLA; o; P4 `; G! f- `
TAY
8 V3 {3 l8 S( r% K2 c9 c( _ PLA- x5 B3 ]$ p9 G1 M) I1 u, e P# X
TAX. [0 q# x0 {# t* j7 v" N- W0 [* L; y
PLA
( G# O& h. y7 b j4 \3 K JSR $7000 ;跳转到自写程序
& i3 Q2 a) g4 l7 A3 N/ S RTS- y" j, \8 B6 a
ADDR_FFCA:
6 V( |1 D5 E. e( n8 | PLA# C" S7 b' o$ _
TAY
. H5 T6 ?" O; H% w PLA
0 t" v3 e; A& S; O9 k TAX
! E0 t1 D: k) t) j7 W/ \% ` PLA6 W2 @- s+ Z- ^1 M" S( t& P ]
RTS+ d. E$ e+ r6 K! I% a4 H
/ s2 c1 h0 d# y' _# G; n) z, J& e! H
7 [- e" U ?) m! I. Z) l
5 F0 ]! C% J6 J t( c: X5 @' _6 Z .ORG $C264 ;自定义的MAPPER2切页程序
) g7 K" V: s* N, _, ]1 K PHA
& Z& Z# W9 Y7 W, ?4 V. L TXA
' s+ J9 j) ~" h PHA* k' K/ E3 L1 o8 k% U( L9 d
LDA $00664 `& |# [' R) G6 D
BNE ADDRC280. C1 W. H) ~5 G) F
LDA #$07
' z7 Z. o0 q& w LDX #$03! w& s2 D$ b! C2 K& T
JSR $CD9B ;自带的切bank方法
" l5 ~- E- J6 _5 C PLA9 r+ X0 z# s' F1 l4 c. n
TAX2 O0 |8 ~- ~$ u, Y% x; Y: c) r2 g
PLA
$ |7 n. X6 Z8 S. N2 Z JSR $8000, A0 m3 w% u0 Q/ Z2 G h5 U
LDA #$06
3 \+ K8 u% J6 W* V LDX #$03. X7 s' s% R. o; P5 a2 U+ E2 f* F( v
JSR $CD9B ;切回原该切得bank(可以不用)
( b y X& h, D' @ RTS
/ Y5 q1 e3 Y3 {. W4 d. U( {ADDRC280:
1 C" z7 e- N# N2 s; G6 { h; I# ] PLA$ r y5 k7 [1 q
TAX4 p6 {3 V4 f N$ P% I
PLA: l* X& t7 ^. y
RTS' d) D+ e- v, v3 B# R% P7 V) |2 l
. A% @9 C2 S9 [) W5 p ! {2 V0 | s5 i7 `
;[FC][最终任务PPU][END]
; p3 M1 t3 {, @ .ORG $C056 ;跳转到PPU重写程序
' ?; d" Q' |1 Q. r JSR $7000$ ~5 Z' {4 t" y; e+ p0 Y* L9 m& R
0 |3 F# I( q: K
.ORG $CEBF/ w v9 K5 C9 @
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入) {% a- M `& F3 D
" e2 t* L+ D% A9 v% [& x& V
.ORG $E460% U" m9 Q4 N5 z/ a
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入" _2 i' U+ C4 d
5 d2 A; w( X% I9 g% S .ORG $71F0
- k0 a3 i$ t7 U+ E- Z" K4 z) p nSTAGE_DATA_WRITE:8 l% M, C' Z: v! D2 A
LDA $6010
+ C9 p6 m1 |' v STA $1E ;关卡写入; W& @) h6 ?: [5 b
LDA #$00+ U1 Z: o& t/ g% B" ?
RTS& H' E% Y4 G* ?4 {* a! F
.ORG $71C0& y- H+ {8 M% r' w5 Z/ D
BULLET_DATA_WRITE: ;副武器数据写入
# c9 H. g& T& O8 P; z7 n) B$ B& [ CPX #$0E
9 x' h2 Q3 f/ d/ q. y5 z BCS P2_BUL, S! ^; L2 A) k7 l: ^. x
P1_BUL:
5 u- ]& B" }( B! H4 F6 {+ i LDA $60043 e! \: O5 G/ v3 K' W
JSR $D7D0 ;P1副武器数据写入* k9 f5 \& s* [- [
RTS4 t3 j0 M7 J# _6 ~- N6 W
P2_BUL: G$ ^: ~6 ?9 h7 A
LDA $6005
' f1 b2 n" w H1 L8 Q1 O6 { JSR $D7D0 ;P2副武器数据写入
* h2 n9 |" j5 \8 z RTS
\# E6 C/ ^5 U$ V% u: V6 P. o! V+ {% F3 e! O! q1 F; x
; R; K9 G" [' y: H" ]
.ORG $70005 j( h* a6 z: N0 o; ~5 x6 {
, U- W: l K O STY $4014 ;补上覆盖的精灵写入指令. [7 W0 ^" b# v' L0 X; M) t
PHA a1 _2 y+ s' y* E
TXA
! c' |' D0 d1 Y& ~ PHA
" Z% ~+ i& }/ w. R" B% i TYA
` k; {3 f- ]0 } PHA
& j! V8 P: V, q+ Z) f. u0 ` LDA $0C
. r- [. l% l4 D7 a CMP #$01 ;比较是否为标题画面2 F! K/ {! r! X9 {+ |( D: m( b7 @
BEQ PPU_STAGE
: _- C5 K. b1 C+ s% ^ PLA- t9 n% I9 X# n2 m% d: j8 d% F0 p
TAY# t; v# }% K @0 b( S; h# R) x4 M8 o
PLA
H$ w* r" `& F) b8 K$ q2 w TAX
, P, R$ G0 @/ J9 O' Z, j PLA
2 i/ a* G6 G* t9 h1 L) q* r RTS4 @+ O" t8 J; W: L. \! i- b. j- e
PPU_STAGE: ;STAGE显示程序% o7 E9 n; U: G b& D4 p
LDA PPU_ADDR_DATA
5 D) R, l' z9 g z STA $2006
2 M4 d* o+ b: C" {; Y& x LDA PPU_ADDR_DATA+17 w# k) T% U* j, y* v" j
STA $2006 ;坐标设置
% E7 ]' O) ]1 j0 T LDX #$00$ ^* S* D; d B! W8 s9 B5 N( s
PPU_STAGE_WROTE: ;写入STAGE字模* ]: j3 O. r9 ~* ~
LDA STAGE_DATA,X
/ T8 u! f9 |& l* p0 F0 p0 [# } STA $2007' U1 i; x8 U! z/ ?& k
INX
" T- A# B4 Y2 S, k% Y/ e- A6 | CPX #$06! v# u4 m$ R$ R1 Y3 n. ^' m% z0 x! H
BCC PPU_STAGE_WROTE
- D- [1 A3 [/ c' l6 P LDA $6010
/ Q4 w, E- {6 s6 c# } CMP #$FF ;关卡数据初始化条件判断
, m4 W$ T- [; [' g4 s: U1 B% K( ^ BNE KEY_B
7 K; L$ d9 n9 [; o LDA #$00& E- T- @& |' w# r% O
STA $6010 ;关卡数据初始化, R! [) C+ q# l. g. A- b1 d- X! O
KEY_B: ;关卡减少' T5 U4 V, F* k: Z; _
LDA $04' \9 g/ w& O% a* ]& V
AND #$42 ;按键B或左减关
9 d6 x% z4 n* l9 Z6 b# t p* V BEQ KEY_A# c9 {, ], t7 r6 C, \+ U. [
LDA $6010
1 H2 H, |/ B* |0 i CMP #$00 ;关卡比较
7 S( q6 P. ~# T" V) t BEQ KEY_A
$ K, q8 `/ p f: W' ]. v DEC $6010 ;减关+ u/ I' N3 g0 N6 M3 J# N0 k
KEY_A: ;关卡增加
% ?3 F, M3 v' T5 C! S- f- W4 ? LDA $044 Z$ V8 y; b9 s* Y
AND #$81 ;按键A或右加关/ `1 _2 _2 b2 c* g
BEQ PPU_NUM_WRITE
) [' [! Q4 S! _" _, S LDA $6010
8 w, c5 z: R9 y9 y CMP #$04 ;关卡比较
2 |! ^! r" M* @* W, N2 r BEQ PPU_NUM_WRITE
* ^3 b- h3 o' p5 V, b/ R8 e) q INC $6010 ;加关
4 w! W7 g: v3 b3 ]7 t+ }PPU_NUM_WRITE:, i8 H! y1 E% I: D2 e
LDA $6010
* N( I6 v9 v* y, n$ f8 [& a. a, Q TAX
+ M( s# m. Q0 J% l! H LDA STAGE_NUM,X ;写入数字
* _1 u; D3 V; q. h6 f7 r STA $2007& L f0 ]& Y9 k# ?/ }; g0 S
PPU_RTS:# s3 f2 d I& \; |
PLA9 ]6 y ~3 ^3 T3 |0 W; d# m% O
TAY
* S$ z: c; R0 d( w PLA
7 [* E) i' R7 \0 P8 x TAX
: H5 {% f% n9 i( H7 \( ^ PLA1 F0 w$ j+ [/ |: g4 \
RTS
- R7 P8 `; \" U$ q- u
( W! y0 |, S) T . {! v6 J8 n; H- b4 ~
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据6 q& G& m$ `+ |# S' W
.BYTE $EC,$ED,$DA,$E0,$DE,00: }! k& a3 q" s/ t" d! `: e% x+ R: i
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据
( }, x' W2 u( g, o* F/ b0 y) p .BYTE $D1,$D2,$D3,$D4,$D59 ^3 H6 j3 S1 @8 G5 h5 \
. l" H2 P$ B. A$ g" zPPU_ADDR_DATA:
* u/ B7 v2 ]3 r" J2 T7 B: s5 p* | .BYTE $23,$0C9 H+ J8 N3 H, E" F3 U- E9 r
5 E* T0 W# R7 G" f! F+ Y
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|