|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 % c; E1 k6 B5 o. N. N
1 i# D, p4 |$ s! V7 M+ q得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.4 T' y- d+ L) g% m, v
然而,今天想到一个思路.% u0 P$ }* _- D: ^ K
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
5 v! l( E, E0 e4 F; L; u2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE5 E( l M8 L! E) u9 A& F
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).3 g1 `& j# R4 K
. W1 f" T$ z5 x. D9 D0 @
5 T9 R$ z2 s+ h8 E3 [
;[FC][最终任务KEY][END]- P1 w4 N/ A, N/ B5 x% |
button = $04 ;单次按键
$ V( m4 L3 R# Q3 Q4 D2 A& a: aflag = $6000 ;功能开关标志- p" V* `4 j2 u
pause = $000E ;暂停地址
2 \3 ?4 K5 z4 r. a7 q: C" b: W$ i6 {% q* u" {' T7 h4 o
.ORG $8000* k! y4 ~& ^$ S2 D4 i5 g& }# e6 R
LDY #$08 ;自带的按键程序
. @# M3 c9 }5 i# Z" e4 D. \ADDR8002:- t! R9 M' x9 X
LDA $4016,X3 w# S. F" e; N5 e9 N
LSR
7 ^. H. y% R, Y: r ROL $0021- M+ h' L6 E3 W9 u; R9 p' K# ~1 p' r
LSR' D+ \$ Z, Y- y7 c
ROL $0029; b+ R: M. T- Q5 `: B+ b. u S) E
DEY
4 j3 r8 o4 Y7 j. f3 a* K- c BNE $8002' U h! S8 P5 p. L' b: E+ H. I4 s
LDA $0021
: Q5 o/ C- K5 y9 }" U" e ORA $00297 _' K& z" d3 y' x! q% Q
STA $0021
7 T* h' Q: T5 ~& u0 E LDA $0020+ p! K! g' f+ A4 v
AND $0021
7 h' [/ k+ T' V- i STA $00206 Z1 v3 i+ q1 z% U* _. p
LDA $06,X
) g: l7 z6 i6 M+ V7 L; j EOR $0020. ^! @: ]5 L. _+ y) c0 A; \) T
AND $0020. V {' G- X+ e
STA $04,X5 y. i; m3 U4 e' [) v# f( e
LDA $0020- S3 h P I' z2 n# U
STA $06,X8 l! A" L1 }1 Z* `) U* i
JSR KEY_OPERATE
, {! q5 W8 G% c7 |( P6 e JSR Function ;功能调用+ C" O2 h0 n/ A3 K' m6 o8 U9 F# ~9 S
JSR Weapon ;武器切换调用# X& t& C1 K8 B8 U$ B7 p
JSR Power ;威力调用
# w' v' \! d8 i JSR BULLET_NUM ;子弹数目# f5 n; [) o8 k+ y+ T7 u4 |
JSR BULLET ;副武器类型. _2 x, x* o- j6 D6 V
RTS5 H: d+ h0 I9 K& ? N' d6 {: i
; N- N# O/ \$ u5 C
# Q( @* i, y0 \4 s1 x$ M* ]( v
.ORG $8050, b+ ~) c2 L1 N$ e+ d9 C3 c
Function: ;功能
0 b2 _' f( R7 d2 e5 @3 P( T. BWUDI: ;无敌
3 F$ b4 A0 w6 e LDA $6000,X1 E+ n, y7 G t
AND #$08 ;开关判断3 Q- l( ~4 X% |5 v, N
BEQ LIFE4 F8 n5 ~( G4 v& e
LDA #$05, @8 d9 m& Y4 f/ R, x: \% J
STA $05DC,X ;无敌锁定
. i" E" q @+ r2 j" \. LLIFE: ;生命
' x* O/ m7 t3 V% M" \: q LDA $6000,X/ S8 N; F3 \$ q1 f0 i- p" X$ b
AND #$04 ;开关判断
' U& _3 d# u7 S' L BEQ FUNRTS7 x: K/ Q9 Y' P7 h0 S1 s- M1 v! M
LDA #$05* q/ l0 i Y+ g" c
STA $1C,X ;生命赋值
) ^) D- u. S. N) b# x4 w% vFUNRTS:
2 t1 q8 U* \" `1 i* g# U/ g! ], Q RTS' V- U: F e# ~! p7 Q
+ N& ? O. C6 \) U7 E/ C- m( e- fWeapon: ;武器切换
% M$ L1 g7 L) A* Z' d% e; L LDA pause ;暂停状态判断
0 a) W) }& g+ Q, l+ b/ t BNE WEARTS
# ]3 Z: }3 R0 [, \! d1 y LDA $04,X
( j, ]0 o9 u( c) }5 F; a2 O CMP #$20 ;选择键判断
. V: K) ]5 f8 O8 p( w BNE WEARTS; k9 y m3 g3 l2 B
LDA $12,X T2 q. S; ?3 O" N( t& j
CMP #$03 ;武器值判断
) `# B3 n0 \, K: s) f) ~ BCC WEAINC) b5 }) n0 W; J t6 S+ B5 `) j
LDA #$FF) g6 ^+ u: f8 f& _2 i. t
STA $12,X ;武器重置
4 `2 K3 y* a, d" u. Y9 v# _2 _0 @, LWEAINC:
# j& Z& ? y$ o6 e& q, e2 h* G1 h INC $12,X ;武器增加
% N7 ?# Q4 \6 B" _2 N0 ~* N. q
5 h8 D8 q/ W4 l$ Q" o! j( n, wWEARTS:8 S' n/ ~2 `) }2 n: i* r
RTS. m) _) l p& Z2 u1 t" D# q! L2 [
3 ]* P: q# L+ a; L
Power: ;威力
9 \2 P, N7 t* j3 v, o0 F LDA pause ;暂停状态判断* g% v/ ]! b% @" r& z1 m! R# Z3 }
BEQ SPERTS
+ [1 R* O* M. o. t8 H0 ZBUT_LEFT:; p4 [6 o, K& [, x: X( S3 V
LDA $04,X
" d# _' O& C- a& P: ` CMP #$02 ;左按键判断( V- } ^; r: x- N
BNE BUT_RIGHT
) D F" \) g4 P) h% V LDA $88,X
* d2 s' c. L# Y3 k4 {, {) B CMP #$00 ;威力判断5 z, `& i/ Z! ?* ]* D
BEQ SPERTS
3 i i# h' s% v' M e9 N. HSPEDEC
# v7 R5 C1 x; g) w LDA $88,X ;读取武器值
& V2 g$ G1 H0 X$ L0 ^# p$ _ SEC1 N: Z, H4 d; M7 @- ~5 \; C
SBC #$08
0 I7 L3 t( q# `' a: G8 X STA $88,X ;威力减小
/ H& {2 G; k. S: r- n# BBUT_RIGHT:* U' ^# o. P5 V; m: C
LDA $04,X
3 j. V' z4 \) Q CMP #$01 ;右按键判断
7 ?: ^$ ~8 \- g6 j3 G" [8 q, h, c BNE SPERTS
1 D. m" l# A$ Z) B, |- e, Y; T3 }3 A LDA $88,X
* Y( o0 I) d$ K1 f5 d; _ CMP #$10 ;威力判断6 u! x2 n8 i2 y( x- i$ [( a
BEQ SPERTS
f. A$ J! o: k9 \' _SPEINC:
% J$ [6 W% F$ [. U: m# T) Z LDA $88,X ;读取武器值- \5 v9 H: p$ e x
CLC& s' U- G* w& U. |0 I8 G
ADC #$086 H% s) q0 i# k' s' E5 A
STA $88,X ;威力增大+ \# K, E# {6 _: w/ k
@, `% e b- ]; D2 `1 V( z- F8 o
SPERTS:, D" U- l) _0 b6 S" O+ A( h7 N/ C% t
RTS7 _0 b5 N7 R* i$ t' h! T
8 j* R' C3 Q8 [5 u- B& UBULLET_NUM: ;子弹数目- _/ u; I* M+ z0 \6 d6 V/ m; K
LDA pause ;暂停状态判断9 E4 N, s/ v. w- g @9 \7 d
BEQ BULRTS
& I6 h K; h7 W7 _) i CPX #$00 ;主机玩家判断
+ }# U- e# h- {1 Q1 m BNE BULRTS
r" s' O3 m& S- d& J+ V LDA $04,X ;主机玩家判断
$ p# I% _! K' g3 H AND #$80 ;按键A比较: e1 K! d. Y, p7 H( o& d R3 o. R
BEQ BULRTS
8 O6 Z% o; {; p) W' _, k. h8 n4 V' D LDA $87 ;状态判断
9 g+ B/ t) Q9 m! K, _7 X BEQ BUL_2# a- {5 q% r8 S3 N. c
BUL_1:% z/ h V- ]5 U( w0 B& g- B
LDA #$00' Q4 K6 B4 G* h3 s( p2 T4 \8 M# H
STA $87 ;1发子弹4 y, r: B5 y$ ~! {3 Z& x
BEQ BULRTS
$ E" T% ?/ K7 R/ j$ xBUL_2:
& u6 X" ~2 \3 C8 t LDA #$01
/ A6 b: K% e( O: g2 O) _, p, h$ h$ A O STA $87 ;2发子弹
: k I) J5 \3 m( }1 Z 4 i1 T- [$ J( ^. y# v& u8 g
BULRTS:9 Y; X* {0 x7 ~/ b6 n. j, ^
RTS7 ^% Q: t1 h1 z2 a
3 J7 O! q/ T( {2 c& B
3 L% l# u8 x: ABULLET:
4 @2 J# P, J2 V2 K8 d8 P LDA pause ;判断暂停状态
6 Z+ Z. M& a! r/ p9 m( I BEQ BULLETRTS
- C9 m7 d/ v7 z* h3 t% i9 i i, j LDA $04,X
5 x' Z$ M) g4 |6 g6 R* d CMP #$40 ;按键B比较
7 |5 ^$ F+ \5 | BNE BULLETRTS# Z6 I' k* s7 J& ^
LDA $6002,X ;读取副武器 o" V G& n, t& X+ {
CMP #$03
* U9 ~* t. `3 B r" g BCC BULLETADD5 n- G8 r5 c% K4 r% p& A @* N) V- l
LDA #$FF
' r% \% c$ q- {0 w STA $6002,X
* y( C; h+ y3 d6 u/ S' GBULLETADD:/ z, V' c- T, A1 w
INC $6002,X8 J" a; c$ a8 Y
; V3 I% O w. } W% j6 W; fBULLETRTS:8 n4 I7 _1 Q4 ?& p$ }
LDA $6002,X
/ B+ K5 e( C& ]9 F3 q# p$ c" c TAY* @! o2 S5 H W8 N
LDA BULLET_DATA,Y7 T |) c; j$ C2 g) [- `
STA $6004,X ;写入副武器数据5 M i* i6 @! U4 o) Q9 b
RTS
8 N1 _5 R4 k: I, r 2 |' n5 F1 U, t- i+ ?2 M ^
[6 K, P% S' {" Z& S& D
BULLET_DATA:. L0 ?* Z$ z% V U& W
.BYTE $06,$02,$03,$044 G$ B$ T( }' q, }! h6 A- f6 I
, k8 y2 T* D* ]2 N2 K6 q/ b
, J2 Q( b6 s8 }& V * v2 j( W; Q6 H/ x: k
KEY_OPERATE: ;按键开关操作
- T4 E7 ]4 j0 K4 z% edata_protect: ;数据保护
$ C: p2 ^7 }) j0 \7 t PHA
( a, _$ z* `( k8 a- I; S' A TXA
# f. h- u, V( f3 y PHA
* V1 u8 s, e) `& P TYA
- B# D+ y: m; @ PHA
) b! R. P+ e4 A/ |
# R1 a* t/ a) W7 [3 L: xFLAG_INI: ;开关标志初始化% l, U/ O% l1 x0 d' \1 U0 ^4 J- ^
/ w5 E( f" `; `9 n/ S! ^) z LDA $600F6 _+ `) B0 R$ F+ d6 V6 E
CMP #$015 @6 f5 j9 K7 r( Q
BEQ pause_cmp
7 M, E q' E" C) i LDA #$00
; W5 H* j- T: u5 D9 x) O STA $6000
. w1 [+ }6 H+ W$ n STA $6001
: B/ I% N* m6 A) w6 J STA $60026 n" b- Z( ~( O- ]
STA $6003
l4 S* x {7 { STA $6004# \' X1 {) O6 b9 A" O* W
STA $6005! T5 B) c$ O0 `- b
LDA #$01
' _5 W, b2 F: @" K) O STA $600F
, F1 \6 W( i& t8 t. H# g) X" }
7 N) v1 G( v; V# ~3 D: Bpause_cmp: ;判断暂停状态7 U; d' j; E7 `# a! E2 _# Y7 D
LDA pause
. M$ V7 D* J# | CMP #$01 ;判断暂停状态
) d: C0 ?" ? _ BEQ button_press
# m* [' f2 ? |4 Y5 |6 k PLA* I! S- T4 ?0 [6 a
TAY
% d1 I/ x4 [' h/ E7 _& K PLA
2 ^: v) t$ F" |# E TAX+ q& i% W3 e; k$ t% j) _
PLA
5 p& I3 z3 i( [" h3 Y2 i9 ` RTS6 P. ?' n- h; E: ^
, X; Z5 a$ |( D
button_press: ;按压操作, Y1 o- i8 s) T
ini_Y:
2 Y, z- i$ s- v# e, T" [% s LDY #$00
' w2 r4 F- {+ K! x8 F4 ]- |button_cmp:" w" _- s/ H5 ^( F; P2 {
LDA button,X J- E) c+ `% D
CMP ora_data,Y! ^! M5 l6 r y) K
BNE count_Y_cmp6 g. G3 d* p0 N) A
flag_cmp:( U4 m0 K0 x4 g8 \) ^2 ^5 X
LDA flag,X; ~3 [6 A. L* J; D/ R6 F1 b; D
AND ora_data,Y
1 p' } @& p( m BNE flag_and G& s, T' {: _* j$ Z; Z
flag_ora:" B! m- K$ u& F- }& }
LDA flag,X
* W+ S7 I' x' L" R+ M% { ORA ora_data,Y
+ y; M$ |3 c3 U5 C/ L# \0 N STA flag,X) f J# h! M3 G
BNE count_Y_cmp
7 ]5 I( e& Z" i( uflag_and:7 B& Y* I1 a0 T$ X# {2 k2 o
LDA flag,X8 w6 t( i2 b+ @/ I' ~( ~7 |! b
AND and_data,Y& I+ I( Z' Q K3 S
STA flag,X
u3 g0 F! O- Zcount_Y_cmp:
) W/ P/ R; A" X; q/ W: T2 c INY
$ p1 i8 Q' ^; k' m- m' o CPY #$08/ C7 Y l% y5 H) \! {) _, {" U; \6 `7 p
BCC button_cmp
8 U! p- U: @( f: Z4 e) \6 n% F ; }- @1 R, J; l1 i, }
data_extract: ;数据恢复
& t+ V0 t2 [* Q2 H PLA2 s1 Z, o3 }% B! I* `
TAY# a( A9 V9 t& R! h- U/ P m
PLA
. |2 `! K% I+ }0 E/ k8 w TAX9 l/ B$ p" v# I6 _7 Q C) j
PLA
& \) \; H$ v9 O' Z/ h6 c
' j& s+ K8 S) E1 j/ ureturn:8 L3 d! ~& }- h
RTS
6 ?/ z# p& I: e - X! W" M" }; Z3 _2 t
ora_data: ;按键相或数据# O E+ p# f) k& Y+ q3 K
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
% h2 \: K, f, [( ]. r8 fand_data: ;按键相与数据* @0 [/ r9 t( q! }! `& ~- ^) I
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF, Z. f& j( o. N4 d* m
D& O* }' j) j
$ y4 H( t9 N7 W/ b& m {2 Q$ M, d
) g) h3 c+ X4 ^3 N1 V& ] ;FC数据搬移程序 BY FlameCyclone
* S6 G, I0 h+ g; k1 S- j% }8 M: g .ORG $8200
: p9 Z" S3 \- B JMP DATA_COPY_PROTECT! ?% C' Q' R1 j3 L( g# O" v$ _
. S5 J6 M* }' F A1 u
ADDR_DATA_TO = $40 ;目的地址
+ V3 O, w, f+ T: ~6 S' u( lADDR_FROM_START = $42 ;源开始地址' t$ e6 h3 k: K% K7 j% I
ADDR_FROM_END = $44 ;源结束地址. a$ O7 z4 ` L+ {2 `( z
7 f7 J1 Z, l W" jADDR_TO: ;目的地址
: d6 `# f3 W' t3 {- V .BYTE $00,$70' R( V: l7 U' e4 B4 e" p& L
ADDR_BEGIN: ;源开始地址7 K* b" A3 d" X4 m$ G- H
.BYTE $00,$83
" v* u1 \ [. R u: i$ LADDR_END: ;源结束地址
' o9 m- r% ?" h" g8 q# P7 ? E .BYTE $FE,$84: r& d" ]8 u2 k- v; L& J% ?
( F! Y9 x$ y3 X! I* QINT_ADDR = $08 ;中断地址& H' i& ~; c; x/ t/ R
FLAG_OVER = $71FF ;完成标志
1 q6 o: q7 T7 @% c
( B! I$ u4 w7 p4 f I2 i# ~- J) U& X3 ~5 ^
DATA_COPY_PROTECT: ;保护数据6 e2 | A7 _1 i* {" y7 i) _
PHP% C' V0 ^2 ^1 q, W+ l
PHA+ \# j g; k; f& `- D% D
TXA/ P2 C, G# v. L/ r, x
PHA
8 M9 g2 K: U1 }* z' ~ TYA
' q( W% c( C8 O- W PHA' s) W* C$ ?+ C7 G: C. l
LDA ADDR_DATA_TO
3 A( M8 f7 r! n. p9 k: l PHA2 ~' P9 ?, w& i! z9 `# \. j5 X
LDA ADDR_DATA_TO+1
# u$ U* \! I+ B( | F+ }. x( D PHA6 `' W X8 m: e4 e
LDA ADDR_FROM_START; c) k D! U! B+ T/ [
PHA& T" s( a. z% s# a
LDA ADDR_FROM_START+1
- x/ z( a4 h: E6 G4 f3 k2 j3 j PHA
" Q& e# p7 e9 X6 t4 n( z LDA ADDR_FROM_END5 o% H1 V4 b" a7 W+ N& V
PHA
" O0 A. c l2 Q- S LDA ADDR_FROM_END+1: {6 k% _$ N2 V# b6 } x* M" N
PHA% f: o% X! D( L- t8 E0 q5 m
. a3 X# S0 {" ]0 c' DOFF_INT: ;屏蔽中断/ ?5 m7 t$ r; c4 F" Z
LDA INT_ADDR W g- G& M3 c( _% }' Y
AND #$7F
- `. ~& z( Y% J! }% l+ G STA $2000 ;屏蔽中断
% I: |1 M6 k1 L' V8 o& R0 i4 s& B: G, R0 ]; f8 @, u! W* k
) z# I& d( L4 [. n/ d& GSET_DATA_ADDR_START: ;设置复制起始地址+ ]- h& w }- S
LDA ADDR_BEGIN% I2 r5 ?! q/ B, }
STA ADDR_FROM_START ;设置复制起始地址低位3 J2 q6 ?" T5 c$ M5 i( ]/ |
LDA ADDR_BEGIN+1, M/ t0 P9 T/ C; {; V. P
STA ADDR_FROM_START+1 ;设置复制起始地址高位0 X2 ?1 { s5 n0 m, F$ `: c2 f
. I, D: D$ m6 ~7 s+ [! y E% ?, ]SET_DATA_ADDR_END: ;设置复制结束地址* A8 x1 F; }1 w- }9 D* Y; a9 X
LDA ADDR_END
! Z! R. L5 N; R STA ADDR_FROM_END ;设置复制结束地址低位9 n4 Y0 l$ s$ N9 z( R8 l
LDA ADDR_END+1
% E! E& b1 [3 B3 B" W2 | STA ADDR_FROM_END+1 ;设置复制结束地址高位
3 C) ~" a: u# E7 F$ O
. w! ^2 J" p: _" s6 x: NSET_DATA_COPY_START: ;设置目的起始地址1 H. l4 [1 q4 O- I7 |0 G
LDA ADDR_TO2 D9 g/ j2 g! S' ~' ?( ]" ~0 Z% P
STA ADDR_DATA_TO ;设置目的起始地址低位
6 E' v5 n! j% b5 }9 c/ e1 d- ~ LDA ADDR_TO+14 x; v4 L9 k- \; R" ?+ O* G
STA ADDR_DATA_TO+1 ;设置目的起始地址高位% n, K) h- j. {; J5 Y4 R
+ E1 o) W" [' e% s2 [* Y" U$ E
OVER_COPY_CMP: ;复制完成比较
8 j2 I8 R; l: _9 \ LDA FLAG_OVER5 |" v+ I+ y/ S/ D+ T
CMP #$FE ;复制完成标志比较
1 ]6 b2 z$ P- L& s BEQ DATA_COPY_EXACT
1 ~7 Y8 h" C7 J2 O! Z" K. K9 J+ ]+ T+ N6 l% T$ k+ f
INI_XY_COUNT: ;计数器初始化! M9 G- H6 t# ^) o4 \2 M
LDX #$008 u- v- d% {. j( q- Q
LDY #$00
c( }" U% U# H! q " V% t) g6 H3 y& U& U2 u+ z: t9 D
COPY_OVER_CMP: ;地址比较, q! k V7 [, q3 ^
LDA ADDR_FROM_START: p- g0 y. m, Z0 k8 ~7 z6 j
CMP ADDR_FROM_END
; w" l, J# N! r" M BNE COPY_START
( s( L0 V! k2 P. V, J, W+ G: s7 T8 a LDA ADDR_FROM_START+1
; h1 z& W# C) T0 D CMP ADDR_FROM_END+1- S" ^3 v. G& p0 D% Q
BEQ COPY_OVER
/ B* w: m& Q/ _) x7 e0 w3 [" \$ Z . Z: C N5 q4 R; J. P7 @ ]* ]/ _' }
COPY_START: ;数据复制开始
2 ^/ [: Z- J& w/ j/ x) Q LDA (ADDR_FROM_START),Y ;读取源地址7 k/ o& V9 O; t3 p0 I
STA (ADDR_DATA_TO),Y ;写入目的地址" ?- s- ^8 ?$ d4 A1 [3 b1 X3 V
INC ADDR_FROM_START ;源地址低位递增, @* R" C. k) m
INC ADDR_DATA_TO ;目的地址低位递增7 e! c6 l- o/ `3 t* e
BNE COPY_JMP! J" Q" V0 [. \/ r( T6 r9 {
INC ADDR_FROM_START+1 ;源地址高位递增8 ?- L% f7 L! S* P' d3 u
INC ADDR_DATA_TO+1 ;目的地址高位递增
8 g! m; G( U6 N4 q* ~
; J2 B1 w1 B6 m$ ECOPY_JMP: & F' W: Z0 C$ f. r) s; V6 f
JMP COPY_OVER_CMP
4 Q/ Y4 S+ f$ c, G) R. v2 {: F" ]2 R u9 z+ ^
COPY_OVER: ;复制完成2 ^& c- L) i0 Q+ K- x% }
LDA #$FE
/ B: v+ k- C4 p& ~1 c6 r" Z STA FLAG_OVER ;写入完成标志, }" C4 I' J$ ]+ |) }
FINAL_BYTE:, @$ K. q2 ~4 N( n- _
LDA (ADDR_FROM_START),Y ;读取最后一个字节( u( y; m, s& i v
STA (ADDR_DATA_TO),Y ;写入最后一个字节* e8 p9 e- U1 G6 Z2 Q6 i
$ @4 \( |* r4 b' a' jDATA_COPY_EXACT: ;恢复数据
3 a3 ~' ~# M7 s; }; O. ]9 \8 M LDA INT_ADDR
5 s. ?% r: z9 H; p" q' [7 Z STA $2000 ;恢复中断
9 X3 c& q1 g7 H% z PLA( D* e Q0 `6 w! T4 Z- {
STA ADDR_FROM_END+1
$ E/ \6 P" G+ V1 G5 N" Z) D6 ~ PLA( e3 L5 Z1 |* {; o' e' X" q
STA ADDR_FROM_END
: b6 ? T/ T$ w* O9 W; ^ PLA
+ C7 o; O, A4 l9 B# ] STA ADDR_FROM_START+1
' K. c4 f8 B, U3 u' z7 m PLA
) E5 l3 V' D" M) n a$ w STA ADDR_FROM_START
5 }7 A. g, j) y0 e: k2 D$ q" z PLA
0 }# e' t" d7 L1 f- @" L/ Y STA ADDR_DATA_TO+1
) C" b# a5 s* { PLA; X/ `5 o5 N/ m9 w
STA ADDR_DATA_TO6 Z; k F* R! [4 J
PLA/ ?, [, W/ d+ r6 z
TAY; z. c9 P; u7 T7 O( T2 ~
PLA) }- D4 H- M5 ]) A/ h1 C8 p
TAX
0 d5 E1 f: d' n8 B% b( z PLA
3 B& m. b+ P9 b5 n6 L PLP
3 [, O& L+ y3 t. A5 z + M/ L& E1 _4 j+ T( w' v
6 H* U. z4 K( H0 m* z# _
9 B3 N3 `2 b' t; ADATA_COPY_RETURN:4 ?+ A7 M9 W! T$ v
RTS
& b0 W. ~/ t& } ?; R( [4 T* y n' [ B% f. g0 v L" s/ ]
.ORG $C056 ;精灵指令覆盖
8 |! R5 K G# U% ^ JSR $FFB5 T# E$ N. A# T4 W
- l3 R4 A/ \" i, ~ .ORG $FFB5 ;/ l# g5 r% ]! _
PHA
! y O" Q( x2 i( C3 E( Z3 y TXA% C! `2 K1 h/ D+ H' X7 X/ S2 y
PHA- I s2 p' T1 f
TYA; |: p3 G1 U5 i- o
PHA
, H: M. w8 S! H4 B5 R9 ] LDA $71FF ;比较7000-71FE数据是否完成复制5 f6 n/ M! q6 b% } @
CMP #$FE: T q& f9 R/ Y
BNE ADDR_FFCA$ g9 t" g8 n, X6 z3 X
PLA
9 \6 f4 ^0 p' o TAY
" l7 g6 _, n7 ]" P: z8 U PLA2 D+ i, ~$ @; i
TAX
. t/ h) \5 U7 H$ D" k PLA; l$ X( }- j$ n, L, D
JSR $7000 ;跳转到自写程序
) {: w( ]+ n( A RTS8 D/ L, Y5 d& q- x0 f5 d% a7 S
ADDR_FFCA:
% S' @; X: g: Q! @" f4 D PLA
" R! s- j/ \# G TAY0 r- M9 v" m4 H. L: Y" @, L
PLA
7 X% w R7 I" ?2 l7 E" o/ Y V TAX
0 R0 G; ^; q/ D PLA4 f3 K( Q. V* K6 t
RTS. D# b$ j' m1 O5 _
& }$ W e+ F* o. O H
: s0 o- | `5 z& M$ z _3 ]; Z* G7 B0 q" B# m+ a4 E O
.ORG $C264 ;自定义的MAPPER2切页程序( }; F8 G- f( v. C" B& K
PHA/ V* w( b1 g3 K: y+ u% U. u+ h
TXA
4 V# \& U6 l8 v7 `3 U PHA% @+ Q0 z) c$ Q/ ^$ A6 y7 k* S
LDA $0066
- R; M& s$ {) | BNE ADDRC280
4 r& q6 Z4 U# Z. r- ]9 \ LDA #$07
9 _( g; t# L) j6 D& a LDX #$03
; d( a1 o& p- v, O) B3 a; F% W JSR $CD9B ;自带的切bank方法& \7 U, Y% F/ S9 B' @3 T6 x. d5 _ ~
PLA3 p( u4 W1 _9 U' t7 R( t
TAX5 N" ?; I* |+ S
PLA1 J& Q+ L1 N0 h+ F' x1 P
JSR $80000 _1 i/ A; i2 N; \
LDA #$06
2 g1 f2 K/ x v( S7 q LDX #$038 w$ \- B' H/ ] _, J
JSR $CD9B ;切回原该切得bank(可以不用)- J3 \8 Q7 R9 @, ?- }* L' H
RTS Y$ m7 F( S% t2 b% p" b
ADDRC280:1 n. c3 ?4 }4 f
PLA& c. E/ D" A' M* ]& @" D* @# ]3 k
TAX
G0 c1 M- ]: q PLA0 f+ o. K) d* f0 A, t
RTS9 D& V1 O9 l. ?% `
2 O/ }/ P: S8 R/ Y, K4 Z5 I
' ^: }% R8 }* [4 Y; |6 u;[FC][最终任务PPU][END]2 b9 Y( r( _8 z+ M" }
.ORG $C056 ;跳转到PPU重写程序% M) A- V, F. H
JSR $7000- R$ K! W: Q8 ~7 W! Y$ C
! Y5 a: H$ R" [: V: S6 [1 ~
.ORG $CEBF
! Q& Y3 s' p( j; t* C4 i: t JSR STAGE_DATA_WRITE ;跳转到关卡数据写入) p' @! O' _/ ^/ w# g% g
: {: D5 l* _- `
.ORG $E460
$ j& B" \9 N5 k% a3 d/ w JSR BULLET_DATA_WRITE ;跳转到副武器数据写入) u6 d U4 U2 D* L
9 D6 F; h- w; K
.ORG $71F0# ]6 e- M8 N/ z( b
STAGE_DATA_WRITE:) b0 R8 }4 q5 x! @1 t. b
LDA $6010
" v2 E: Q% l- r t# b8 O( a9 W6 X2 ~ STA $1E ;关卡写入
" P2 O) i5 L1 _5 F LDA #$00, K" W2 ]* |& O8 p6 m+ H
RTS
+ S- S2 H, c* V2 i% M' G .ORG $71C04 p8 @6 _* i3 \# D
BULLET_DATA_WRITE: ;副武器数据写入
- \4 o7 |2 @- a CPX #$0E
' F$ B7 u/ x% K* W5 a BCS P2_BUL! U7 _ I5 M: |) {* x5 }& Y' C
P1_BUL:: a0 p' C' N4 u
LDA $6004
" C- y# [; a- }/ S3 ~6 W8 M# x JSR $D7D0 ;P1副武器数据写入% M5 h' }5 I9 U, \, x1 F
RTS
4 q0 L- Z# G/ N8 `: u" x/ D. ZP2_BUL:
3 a6 M7 G5 g7 t+ k LDA $6005; B. p6 Z& |" [6 [# h/ m, N8 {
JSR $D7D0 ;P2副武器数据写入+ r& p6 Q1 v& }3 I7 S% M$ k
RTS9 V# V& S* Q* s# ]
- s+ \4 e+ I/ v: e0 |
" s2 m% R! j! _' y% F6 ?# | .ORG $7000
! Q4 _( F/ d3 S- y + }; f$ S; ~6 h8 J
STY $4014 ;补上覆盖的精灵写入指令
5 _$ _" s$ P% S9 ~" N. d" A PHA- B: d0 |) D% K$ b7 P! O& S
TXA
' y) a! C/ k' S$ L3 |/ T PHA/ A7 V# U. |! n& D% V' X& w: ?
TYA" _; M. H* ~0 S9 L' @" g- g" u
PHA+ I s4 c, g; C9 y: E
LDA $0C
& ^7 K! {/ H) [3 k0 i CMP #$01 ;比较是否为标题画面
: g0 O5 x a+ C BEQ PPU_STAGE; g5 { s2 |5 V/ q
PLA- f8 r* W9 Q. t
TAY3 v: B( G7 _* t, R: Z
PLA
% L6 J/ A( ~9 X3 R TAX- U( F2 [' t; Z+ x8 U6 ?
PLA+ R& |; [9 h* ]; p3 h
RTS5 v0 E5 y. H8 z! Y @
PPU_STAGE: ;STAGE显示程序
7 Z) n7 m) `8 s: n/ @% E LDA PPU_ADDR_DATA
2 T) i7 g' [4 I: B" D1 _& R STA $2006
2 \% k0 C7 g" q# h& O: @ LDA PPU_ADDR_DATA+1
- j: K, g: Y% D: a9 [ STA $2006 ;坐标设置* Y9 j% B9 K$ e% T% Q
LDX #$00
! j0 W. @. U/ j$ p) fPPU_STAGE_WROTE: ;写入STAGE字模
6 S( N- [; g9 _# p) k LDA STAGE_DATA,X
) T( g) y/ _' A5 A: @! Z( L STA $2007
9 [! X8 K) @& E INX
2 x5 j7 w& d- z. M$ P) Y1 ] CPX #$064 d8 o8 M8 b* u, w
BCC PPU_STAGE_WROTE* r7 ^" E% W# o+ `( W
LDA $6010; w, R n7 b3 e! f5 e! _
CMP #$FF ;关卡数据初始化条件判断
% t; l% r. b8 ` BNE KEY_B
" N# w2 o j0 L3 c LDA #$007 D( j" |5 P1 I8 v
STA $6010 ;关卡数据初始化
: C B8 F' Q* K( _KEY_B: ;关卡减少
" @+ _, b& [# }4 O LDA $04# o. H7 C7 J2 e: X% b; K6 W. q9 C
AND #$42 ;按键B或左减关
* w5 J5 E- e/ N; o- D BEQ KEY_A! A% t9 g2 b/ `+ E) @
LDA $60104 T3 [. }- H( i( y0 _7 `% `
CMP #$00 ;关卡比较9 P) I4 y: ~) G. S- r( O
BEQ KEY_A4 u" ? |+ _9 E& [3 O
DEC $6010 ;减关
3 G' Z6 ?4 ~* E6 |# v( [KEY_A: ;关卡增加
" \% o1 M5 v; i$ A LDA $047 K; Y7 ^ Y; e2 g0 s% t# r
AND #$81 ;按键A或右加关1 a( |: [! N# F3 Q+ N* z8 n
BEQ PPU_NUM_WRITE7 j( K% Q0 p4 |) c
LDA $6010
/ E8 [+ E0 k& k! J. T6 Z CMP #$04 ;关卡比较
; D6 `1 q0 I. v2 ` BEQ PPU_NUM_WRITE% s0 d- G1 A; r# S) S7 q2 F# c7 O
INC $6010 ;加关
8 D' p* L3 [6 n* L+ s+ {, PPPU_NUM_WRITE:
4 l' p3 m7 P2 g LDA $6010- `% Y" V7 @# ] R% z, h
TAX
9 }" b: R2 f9 H' `+ h; |6 \ LDA STAGE_NUM,X ;写入数字
3 u3 @1 w# q! J7 l7 }8 E1 } STA $2007
9 J. @: r$ }; T" tPPU_RTS:
: C$ g- f) U1 ], @# C PLA
, i5 d1 { n+ O TAY
5 K, J% I9 K1 X7 \! M* X0 B; h2 q PLA+ j' P/ t7 Q8 U/ f, D0 t. R0 u$ K
TAX
$ W& w6 ~$ D$ X7 p8 m6 Y PLA
$ k; s. A+ J) l1 T- B* q RTS: ^: H" o0 W- Q. k* ?! e0 L B! C7 w. P! n
4 g+ X% t5 G6 w9 O' ], S
- X& f. }4 V" V9 }' O; ]! bSTAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
5 c2 u' {5 D; S0 f .BYTE $EC,$ED,$DA,$E0,$DE,00' }& _6 j1 ?. q/ E& _3 i: w
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据! Q& q1 ]* } d2 Y
.BYTE $D1,$D2,$D3,$D4,$D55 m, O' f8 k* @% y7 `) X9 ?
9 Q8 ~) t* a0 w
PPU_ADDR_DATA:9 P5 ]% M, N# T4 B& @1 { {5 i
.BYTE $23,$0C2 w1 C; C# R; L7 g9 k
, K2 H: u0 E& p3 c% ]" n% a) g9 c |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|