|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 - m: d& `* k& r, e S6 f$ q3 X4 U
$ M! S _% ?/ L6 K
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
4 E5 h. \9 G; q0 E# z4 w! |. D7 g然而,今天想到一个思路.4 Q8 J9 m7 I! d- M) E# Z" N5 H
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
; v% x9 h7 e4 H/ f9 A" }, P2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE: u& b% L" D# x/ d8 A
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
( r3 k' P' {+ O* [) {9 I0 h; { j/ k- t
. P/ x4 }, [% J# [# q1 J
;[FC][最终任务KEY][END]4 [* [) h4 _9 m( d2 i2 M
button = $04 ;单次按键
: E; s3 [8 B2 m- i% [* \9 I) Eflag = $6000 ;功能开关标志6 q4 z6 ~7 D) ]0 p; l; u
pause = $000E ;暂停地址6 B. u4 i; e. v3 y* p; v
7 t, s% h; I- f- ]' W
.ORG $8000* R; [* z2 d' S, r$ Q' ^
LDY #$08 ;自带的按键程序
5 n, L. Y$ B. \3 l( H3 cADDR8002:
" `% X( I7 m/ {4 Z/ p1 O LDA $4016,X
) ?& p- G s, v8 M d LSR) c: F4 B% B( j6 t4 N- a" H, r
ROL $0021
/ ]/ k- n! E) x V3 {5 r# U LSR% A3 C& h: y8 I! R1 G
ROL $0029" d6 q3 k9 |/ ~4 ` V5 {% h
DEY7 I9 q9 \- i+ }4 P# v% S
BNE $80029 ]! n9 T2 {3 ^4 _
LDA $0021
- t% B+ y. s. u+ C$ ~ ORA $0029
/ J4 }% S( ^/ n/ I6 g STA $0021+ \2 _' a+ H* g$ d
LDA $0020: F; X" @8 u! I
AND $0021
5 u. I% A, O+ y2 z STA $0020$ ~5 }" r$ N" N$ Q4 u1 O
LDA $06,X
+ G; f+ l6 k) s# ^4 J+ v EOR $0020
* p( o3 `& B& J AND $0020
- Y+ x7 x9 I- c/ |+ ?. b6 k STA $04,X
7 |" w/ I1 D# m. F+ c+ @. w LDA $0020
5 D* e1 W+ U* ^7 t0 y STA $06,X
( n8 {# I# x6 S JSR KEY_OPERATE
0 u7 ~+ M/ K w JSR Function ;功能调用
8 y8 w1 g2 s$ W. u JSR Weapon ;武器切换调用1 Y. V: W% W: r. u9 d* ]
JSR Power ;威力调用
8 ^5 f3 n& ^( k6 d& m9 O JSR BULLET_NUM ;子弹数目' ?# |3 B& H% ~* v! c
JSR BULLET ;副武器类型
2 G4 l# i: ]- I# T9 W$ { RTS C& m! o" E# n! f* k1 T3 B1 e
' u" r- ^4 P, L$ s- @
5 e p/ w, V4 _$ U1 x( c- e1 c( v" q( f+ n- x2 x
.ORG $8050
9 n+ g. m7 l# U9 cFunction: ;功能& p8 l4 B2 g2 ?* W' w1 ?, ^6 I) {
WUDI: ;无敌4 L, A- z0 O2 ^& _& U+ b; W5 K
LDA $6000,X- U8 ?" ~& o' M' r0 f& Q
AND #$08 ;开关判断2 x2 `* W! f9 r' R6 x# t; J7 M
BEQ LIFE$ \0 e0 D" h# i) l. y" U
LDA #$05
, `& K9 R& h4 O% z( f$ S STA $05DC,X ;无敌锁定: v/ O) D2 I0 V8 R- G, ~
LIFE: ;生命
, m* E$ J O4 Y U( o* q LDA $6000,X. r3 d& u {3 u3 M/ K5 q
AND #$04 ;开关判断/ j( r5 Q6 Z* n; Q- X
BEQ FUNRTS
8 X& h, V- v; F+ W LDA #$05
- p6 P! t1 k5 h* }4 ^ STA $1C,X ;生命赋值
# M3 j @' t1 m- F& a! E, {FUNRTS:
) y( Y. V) [/ c0 C6 ` RTS; ^3 ^4 J" o, A! E
n" @+ [. `6 V, y$ L: W, p
Weapon: ;武器切换
2 i" U- s6 O% t# E LDA pause ;暂停状态判断9 i$ Z" L, N% g- t% f: m
BNE WEARTS
: W: j% b: m; p1 K1 e- M& n* J LDA $04,X& m% J6 T0 _4 y5 \% d
CMP #$20 ;选择键判断
/ O" Q6 ^4 T' e BNE WEARTS+ e3 S: G" |9 h, a2 Z: F
LDA $12,X
8 B& B. y/ R1 d1 ]# j CMP #$03 ;武器值判断; _" f: a1 i- S2 B5 `
BCC WEAINC) X: G( H9 ~$ v$ h* q8 U! f
LDA #$FF
/ p6 y# o: F% o. f5 O9 z# j STA $12,X ;武器重置; K' w0 r, [* P. m3 b8 ~; O
WEAINC:
5 T( ]* W! v5 m3 H$ [$ e' f' U INC $12,X ;武器增加5 v7 D, s0 r/ L! n( T- _
6 }, a# v9 M L7 E$ DWEARTS:( f* k. Q0 W5 J: a F9 Y* z$ _
RTS2 i0 |; y4 k' L9 ^5 h. T
/ ]2 ~: A8 H) P$ R" sPower: ;威力
( K! S+ L* c* r% i6 n: _. @ LDA pause ;暂停状态判断
. I3 {, q- M- S( W- x- W BEQ SPERTS
3 U1 ~2 e4 n2 n4 N4 SBUT_LEFT:
( g( p) e) N* `! Z5 t LDA $04,X" E8 [8 J6 v- x1 B" ~
CMP #$02 ;左按键判断3 a/ K* h6 N8 q# y6 v
BNE BUT_RIGHT
& a. c% s7 e5 ~8 V- w; T2 N LDA $88,X
F* P' A/ o1 @ CMP #$00 ;威力判断# ^( j5 H$ b g; s' Q; D3 |: V
BEQ SPERTS% m6 b" P4 P: B; x/ F
SPEDEC5 Z, I( u$ P$ `
LDA $88,X ;读取武器值& {0 ]- q* ], u" }
SEC7 W7 N4 `9 h+ a) Z
SBC #$08
( R" @ ?8 a" t( | STA $88,X ;威力减小
$ B; G! w3 I, t7 {# J0 [BUT_RIGHT:
1 w5 u q/ X8 r5 p LDA $04,X
: q$ W+ g4 E$ j CMP #$01 ;右按键判断' c: m- x i0 B6 \& W. n4 l
BNE SPERTS* g7 x0 W, @ v3 ^
LDA $88,X
$ K: b' L# J( l$ U8 v CMP #$10 ;威力判断
/ r/ R& w2 K7 W/ u BEQ SPERTS
: K& O, g+ {! v- O2 qSPEINC:
8 w, U6 d# E4 c: l7 I- ]; B LDA $88,X ;读取武器值' K9 w, t& Y6 ^9 W- T1 c
CLC
) L* k+ H$ O7 k. U- m$ B5 j% ] ADC #$08
8 |, r2 Q4 d. O+ h STA $88,X ;威力增大( W$ r5 E( A- T. j
' ~/ H! z% S- d; I9 H8 b3 aSPERTS:
) b6 q' W* R" w8 t RTS
7 a: \. n1 o$ b) n% S* F7 q
7 Q0 O2 t. O+ j2 e! S6 UBULLET_NUM: ;子弹数目6 K% N( _$ a; V) | Y0 i
LDA pause ;暂停状态判断0 I. I4 E: r( ~5 K
BEQ BULRTS- O2 D5 T: ]* D% T& t: [9 q
CPX #$00 ;主机玩家判断9 q8 U7 X$ M) Z/ m# |
BNE BULRTS
+ U8 l' ]+ U, X$ x- g+ \ e$ D LDA $04,X ;主机玩家判断- x4 F% h3 D5 F
AND #$80 ;按键A比较
% J8 S& S; c8 I" n, ?7 f2 J BEQ BULRTS
$ d( r! N( O. U2 v6 C: ^ LDA $87 ;状态判断( F/ P* t2 c' L7 K
BEQ BUL_24 Q/ f- V) S3 F: l
BUL_1:
; L; B& ^7 S/ _8 E* I( o! ~1 D LDA #$00% p+ Z0 V; u! H/ O8 k F6 ~; o t
STA $87 ;1发子弹4 [' G5 @! c+ `2 {
BEQ BULRTS
1 a# D; Y4 d1 R0 oBUL_2:
) P4 v8 I+ G* D, _# j6 K! r LDA #$01
7 q" b" y9 [, q6 ]4 \ STA $87 ;2发子弹 v) {% n( q7 m0 x5 Y- M
1 k: y, ]( m. G& c
BULRTS:, }% I2 m3 _9 C+ P2 }# A$ S
RTS* }/ X7 Y5 n7 t( p$ |$ R6 g
6 p9 p. u& U4 N4 N6 f
2 c8 i+ `- X! N! hBULLET:
" }4 D" G" K. _/ n, Z+ r& D v LDA pause ;判断暂停状态1 G0 f" Q) G. ~+ d/ n, w z
BEQ BULLETRTS; A) s% B( z! _
LDA $04,X8 |9 M% G7 _8 E3 G( B
CMP #$40 ;按键B比较
( F# p" y) R# Z Y; x. j8 j) _9 _; s f BNE BULLETRTS
p: ]+ ]; E3 ^ LDA $6002,X ;读取副武器; w1 i+ T6 u6 r! w- T
CMP #$03' m: _. b+ I# {2 _: x* ^
BCC BULLETADD
; Y; Q4 x6 w9 ]3 ?% d6 @7 w7 G LDA #$FF+ O" |- C$ D: w2 s( F3 z
STA $6002,X
2 o) B* H$ v" x# ?: J7 dBULLETADD:/ y5 H; B4 O# r* K# `, O5 }
INC $6002,X
8 \$ u: Z: {1 z2 N: N, r: g7 \! D! A
$ r4 [7 ~9 o1 r+ _% gBULLETRTS:! G- w2 g- j; H2 w- S1 o6 a
LDA $6002,X
$ m1 t z$ [$ A- T4 Q) Q: l! }* G TAY
! r; H- N/ l2 h* D. V v LDA BULLET_DATA,Y! f4 j7 U: X5 H' e
STA $6004,X ;写入副武器数据
6 `8 c% N. g" H7 _" C RTS
( @/ f) q) Y1 G& G) ?; T* O
" W3 _4 d9 P- e2 Z
" Y0 V: b- T9 Y9 c' \* v, {( ^BULLET_DATA:8 {5 T# B3 L4 O# T
.BYTE $06,$02,$03,$04/ h- F+ p/ e7 ~# X0 O
* {' r: A/ O9 O0 N
- H9 j1 K* p4 P3 ?. s, Y; B
6 T- L$ K3 x% m7 f1 aKEY_OPERATE: ;按键开关操作
, ~' x( ?) a9 e1 `$ W2 S: f9 h4 Cdata_protect: ;数据保护
( s8 i+ K# O3 ~4 E$ m3 \) g PHA* Q$ }5 j2 n' j0 s6 O4 ?
TXA2 O( t- {& K3 d! r& {2 w4 c7 l
PHA
8 s0 D% t. k9 D3 g3 e5 F" C" _ TYA% y- O* N4 q# |% b: X, ]8 h
PHA2 d# b* U R+ Y7 O
: \3 k9 j r/ j+ X8 O8 B ]$ Z
FLAG_INI: ;开关标志初始化
3 \) x2 E; n9 z0 @5 [* \
( t, B, H N- b+ C+ u# e0 E* n LDA $600F# M" M/ q1 ~% @+ s: W$ w
CMP #$01
. Z! t; D% r$ @% v" Y9 z BEQ pause_cmp' ?* ]4 }8 P6 d
LDA #$00
+ v' O8 m# k1 W. Y- y* } STA $6000) D7 }* }; f: ]
STA $6001
: U! n6 H t0 g% p/ o6 o1 U ? STA $6002$ y2 b- }3 r! R n9 N- ~
STA $6003
# T- |+ h6 b4 J: V( }6 v- C STA $6004( W" X; j) H9 b4 M# \0 Q/ k6 } F
STA $6005% O5 C; s# }) B
LDA #$01
* r& ?: c+ ~3 b$ J1 Y) M STA $600F0 ^3 z% K, O, }
- E) d# g+ k1 {, Hpause_cmp: ;判断暂停状态% d, Y1 J) h3 j! Z+ [" }
LDA pause
" Z. a( u% L8 m4 y4 ^2 P0 t CMP #$01 ;判断暂停状态1 ^( x' @5 C' i" v ^, v! F
BEQ button_press
2 }% m7 O+ r1 F- h PLA/ U, v6 y# d- g* B. ^
TAY
6 L; E* Z2 W7 _5 Z PLA. {4 N& f6 E( K, T' r
TAX; P; ?: V* Q+ @7 P2 \$ l
PLA
7 Q: r$ [( b1 l1 B9 g4 z2 J RTS$ |/ h, Q2 m% i. f7 w+ T
* Z) X# X( u4 ^! o5 j2 sbutton_press: ;按压操作. Y& u$ j' M% i/ k1 A
ini_Y:
2 E+ ?8 h" x1 ?" y8 c+ {: N- N LDY #$00- e! M; m& K1 m8 r0 U+ `! f
button_cmp:# L' f5 Y2 b* ]; [* M/ q
LDA button,X4 e4 s8 I: v' ^3 ~
CMP ora_data,Y1 C! h3 ^5 O7 I% A( C
BNE count_Y_cmp; @0 o& ?7 K2 B1 I
flag_cmp:: y+ P+ J- m, d [% {$ N
LDA flag,X
; T {' ^6 O# n' ^- Z& {$ f AND ora_data,Y
! r, }, S. A' v4 h BNE flag_and
+ C" F5 D, n \1 Oflag_ora:
8 p$ O2 d& [ u, E( y" k! G! d LDA flag,X- t7 B# R( \+ X, Y' R4 G
ORA ora_data,Y
+ u" x4 T s+ P" H) A; O3 r) m) ? STA flag,X7 S$ H: O0 B" u) B( q' `$ L7 x
BNE count_Y_cmp" G X: s) c3 {4 t( @# l2 H
flag_and:+ i$ T7 `" u9 _" z: P
LDA flag,X$ a4 s- D: Y8 ~9 e7 }* \
AND and_data,Y" P B& y. j; o9 G( t1 x' |1 L' q
STA flag,X! s$ r* _( Z k% }0 O4 a
count_Y_cmp:
b Z% N N- k( V6 {) w INY
4 }( T. C: p T `! f2 x! Z CPY #$08
- O9 y4 L s; i2 { BCC button_cmp# g1 f% D9 x+ K L: j5 }
$ O& l; R. h9 X x# g
data_extract: ;数据恢复
$ ~/ F! G0 u& s7 T9 b) w PLA
+ E' z3 i1 k H) G# K( G8 o TAY6 v9 v0 t5 M% L% e* G! T
PLA
9 v- Q% e3 ^- q. c: R8 \! } TAX
; \- e& D& y6 V4 X% O, | PLA
U; K# f! e1 d7 ], G0 }" E# ~ 0 g6 [4 l+ F* l" V, e
return:- z; d: l% V4 j8 Z' O2 Q
RTS
- x$ y6 k. D+ D3 `/ j1 M, p . V: r8 _6 H$ U7 x& g$ h
ora_data: ;按键相或数据! d1 b% |4 x, {
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
2 I1 t9 Q7 E; `/ P: G! i/ vand_data: ;按键相与数据$ e5 a* z, r3 C; ]* Y4 f
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF3 m4 G& R) u8 h5 m4 A
" f1 u- Q0 J# D F 0 j/ B6 }/ X1 V, Z# Q
( {1 C/ W& o- b0 v7 e
;FC数据搬移程序 BY FlameCyclone
# h; q+ `6 w. V7 O* m; n* e- q, G .ORG $8200
0 V# i8 e6 x0 |& p# ~ JMP DATA_COPY_PROTECT
" U& ~( q5 b& K' Q/ S# i+ ]
# @8 W" |! m% F8 t% G8 qADDR_DATA_TO = $40 ;目的地址
n; h3 b @& r- G! P' rADDR_FROM_START = $42 ;源开始地址
* c7 z4 p, n/ HADDR_FROM_END = $44 ;源结束地址! \( j; E( l9 F3 _& ^! c
2 g& t5 P. @8 Q4 PADDR_TO: ;目的地址
7 E& l |6 c2 N/ i# N6 O .BYTE $00,$70& q5 k: V2 p7 i
ADDR_BEGIN: ;源开始地址
' u* B+ p$ O+ \. }9 L. a- o .BYTE $00,$83
: `5 u: R- q1 l8 Q: ?# TADDR_END: ;源结束地址
% b+ K5 M) y% M0 q5 ?1 a .BYTE $FE,$84) B+ H- Z+ C0 _! r$ a6 `
! C9 ?3 p! Y0 P$ W* J. A
INT_ADDR = $08 ;中断地址 D$ |7 n8 [, u5 l9 N
FLAG_OVER = $71FF ;完成标志+ D% {* x7 ^6 F! n( v; Q
! b W3 e" ?; D, p3 L
9 Y7 `; b/ p# j: v. q$ k+ b* s( |# B8 d
DATA_COPY_PROTECT: ;保护数据
" M X0 e5 ?2 f4 ~ PHP
# f0 E8 a# O# d, s1 T PHA
' D1 b+ t/ g" |8 c TXA
3 q+ ]; n) |! R" v ]0 e PHA! i4 s, [+ ~9 r$ v) F& Y" y
TYA
9 Y) ?. _1 E% M! l c PHA
/ E# r- \& x2 w1 [: z' h1 j LDA ADDR_DATA_TO2 {: }' M# G% U) O
PHA
8 ]# V9 u6 Z' @ LDA ADDR_DATA_TO+1/ N9 [4 T- x* f! _
PHA
( h/ k3 ?$ Y2 k LDA ADDR_FROM_START
" z6 {4 ^% Y2 z: A# `" C+ [9 c M8 ` PHA
6 \ N+ | l# V LDA ADDR_FROM_START+1
; k" d5 A" P$ E4 b& S U% ~/ b PHA6 d7 J4 S% D; D2 L- a: n8 u' ?
LDA ADDR_FROM_END) F; ^6 s( a! @" k- P/ r1 P% l8 J! Z+ \
PHA
& O# h1 g/ x; k( f7 m LDA ADDR_FROM_END+1; {; V& N- r- |9 r7 q( j
PHA
& K2 j) ^4 N0 y 7 H, o8 K$ ^0 h/ P" b& j
OFF_INT: ;屏蔽中断
- S% d' x8 `0 _: M( f) p LDA INT_ADDR
) x9 c5 k3 F! B$ y# a AND #$7F
0 j; q; s( [2 W STA $2000 ;屏蔽中断
9 y) Q {3 ~0 y
- H( C7 N( W$ I t; A/ }! Y - B8 [% k. N/ `4 s( U, m! c
SET_DATA_ADDR_START: ;设置复制起始地址2 W3 w8 C9 ?( R1 j
LDA ADDR_BEGIN0 G. A }& F: V' z! P. }6 m2 S* w
STA ADDR_FROM_START ;设置复制起始地址低位0 I0 I. h$ ?7 ~* h* W2 H/ b0 f
LDA ADDR_BEGIN+1
/ C U$ r2 b! t# I STA ADDR_FROM_START+1 ;设置复制起始地址高位
4 {4 F5 C m( m0 u
0 i6 g* Y/ ~( k9 u0 o9 [SET_DATA_ADDR_END: ;设置复制结束地址
- t3 H, F `8 J3 z- r+ B LDA ADDR_END- q9 Q/ H0 N4 a; R# Y7 Z1 E
STA ADDR_FROM_END ;设置复制结束地址低位
* E( p* C! N" y7 t! D+ P) Y. H LDA ADDR_END+12 h; }7 g' v6 v7 R3 T: ^
STA ADDR_FROM_END+1 ;设置复制结束地址高位
1 x) L5 G6 L6 z1 k4 Z ]* K5 l + u. |! K1 b6 m* E0 R* ~7 J8 h
SET_DATA_COPY_START: ;设置目的起始地址) D% o: }2 _6 v+ r
LDA ADDR_TO
% ?0 T2 y- M" ~$ Z8 W STA ADDR_DATA_TO ;设置目的起始地址低位/ p# T3 J& H) G( d! p
LDA ADDR_TO+1
# {/ E3 r) T# c STA ADDR_DATA_TO+1 ;设置目的起始地址高位( d1 h' }2 E. g& ~: {% O2 d
& k! S) A" |4 |/ K, ^
OVER_COPY_CMP: ;复制完成比较
. |4 w4 {9 ?! ?3 t LDA FLAG_OVER
1 @4 F5 l0 g3 O$ Y+ S3 n- G1 S CMP #$FE ;复制完成标志比较
" S% O/ A" r& V* L* w BEQ DATA_COPY_EXACT
& _) D) y4 @+ n
G$ s* O/ Z/ c4 k9 [4 C4 mINI_XY_COUNT: ;计数器初始化& Y9 R/ ~& d$ e+ F: R7 [
LDX #$00
& T' k/ L! S! d6 x* w LDY #$00, G5 u. x8 S1 h2 e& w; Z7 w& T; J1 n9 {
' f- i/ C+ y8 w9 E' _2 N
COPY_OVER_CMP: ;地址比较# S+ t8 ~: p- L
LDA ADDR_FROM_START; l5 j, C* c9 q8 ^, i* V, w9 [
CMP ADDR_FROM_END+ \$ f: I% i# n7 B2 V! O; E
BNE COPY_START
+ W5 g' a h: Q' R! n; x* B$ @ LDA ADDR_FROM_START+1
6 y, W9 M2 }; B; z6 i/ Q g) h9 ` CMP ADDR_FROM_END+1
$ L! B7 E$ V* m3 g BEQ COPY_OVER4 A, ~1 {/ i$ E$ K! m
5 E3 z( V/ y' \- k4 n/ d4 gCOPY_START: ;数据复制开始; c2 n# }1 {9 y: P; p
LDA (ADDR_FROM_START),Y ;读取源地址
$ f6 U: z& F& u& U: ], Q/ ]) \! i STA (ADDR_DATA_TO),Y ;写入目的地址 ]6 W. _' D$ J: q6 Z
INC ADDR_FROM_START ;源地址低位递增
, f! L& O! F; e" X! p- K) j8 C" B INC ADDR_DATA_TO ;目的地址低位递增1 i: h+ u6 X, }& r
BNE COPY_JMP
' [& C. ~. b0 {2 M INC ADDR_FROM_START+1 ;源地址高位递增1 C1 \/ V8 N" P [
INC ADDR_DATA_TO+1 ;目的地址高位递增3 B; l* i0 Y$ k& \# }2 c
' N( k5 O1 r2 x* ~+ l' U
COPY_JMP:
0 W5 X4 `& E# Y0 L- T5 t! B JMP COPY_OVER_CMP
: A! d& N: ^' |1 K; z( R, ^; V* A" q# x
COPY_OVER: ;复制完成
* {/ V$ R- |# j: u: h$ Z LDA #$FE5 [0 T: g& j/ y9 B
STA FLAG_OVER ;写入完成标志
4 C1 Q3 O7 \2 rFINAL_BYTE:
- G7 O! \5 }9 \6 z5 n% V LDA (ADDR_FROM_START),Y ;读取最后一个字节8 a( e1 R3 A" v- K
STA (ADDR_DATA_TO),Y ;写入最后一个字节
, U e# @: K' Y' c5 Y/ @& E# o* V
1 X V+ K* g' [DATA_COPY_EXACT: ;恢复数据
) z/ c. u, d3 _+ x( G' D LDA INT_ADDR) i/ C! J K; l
STA $2000 ;恢复中断8 e+ C: t: k9 n5 a+ P9 Y1 L! r* R. |
PLA
9 H# i2 F/ g, _ o3 u6 l' b; n STA ADDR_FROM_END+1; l7 T6 O# \- T! x% `: B
PLA; _" w( b) n2 |3 A- ?- y1 `
STA ADDR_FROM_END! j; Z5 P9 l. h& b. @* B
PLA4 t3 C a5 U2 L& V1 B3 U* d
STA ADDR_FROM_START+1
3 e9 l8 s; T5 h# y2 d# u* h PLA
8 c5 |. t- ?$ F STA ADDR_FROM_START
& u1 O- Y, t' H: S! V$ D; J PLA
* g+ h+ f# Y {6 F STA ADDR_DATA_TO+1. Q% k d0 q% _' t. |7 }( [# ^
PLA0 U/ _' u$ e4 z Q& Z: d1 [: e
STA ADDR_DATA_TO
4 c! C' Q9 x/ e: Y- C5 A PLA3 L: s" O e. c' a
TAY
* r, m9 U6 y& ]7 Z7 x! O) h. t8 s PLA
# ]% l% K) |2 y8 J TAX- z$ X6 F/ z' L: K2 h
PLA. a4 o% ^ v* |& [ x- G+ S7 z& T
PLP/ b; V0 q( g/ H% B5 v3 Y
" d( J- S# ~* }) s7 @! Y
+ W1 \& W2 X Q; f! W
+ f0 `! L- h: D& |% U' J. sDATA_COPY_RETURN:/ d, D. q' y( R( @
RTS
3 Y5 I4 p+ x9 E$ F8 K; P% D: ?& n
8 A) _9 A }9 u* g/ u# r4 I .ORG $C056 ;精灵指令覆盖
. O7 E/ B& V0 E( _- u6 M- X JSR $FFB53 w2 v$ Q/ N; W. I5 Y! B4 e+ k& r
4 d5 j5 B, p- J- \2 Z8 c- ` Y! f .ORG $FFB5 ;
' Z3 E2 N0 y Z, F2 k PHA
- c( l H) T# f# u TXA) U; ] O8 @# @# M: U* X6 o. c
PHA
* @3 @, j# p2 x- t- f4 H TYA
. ~, v6 h' i# t: p) E PHA
' u4 ~& L4 B3 P( @8 [) ?- {: _9 x& ~ LDA $71FF ;比较7000-71FE数据是否完成复制7 |9 R; x) A1 G- q
CMP #$FE; s3 u |& {* j. [
BNE ADDR_FFCA
8 H/ _: O( a) j8 l! K8 ?+ `# a& _ PLA- ?/ P8 |& A3 M
TAY, l' i/ q& ?* R* w
PLA
1 i5 t5 |0 T; q% p7 P4 m, { i TAX: f2 E7 J. e! c
PLA
' F; J! ]( o0 D$ Q, b JSR $7000 ;跳转到自写程序0 G0 J; k( k, c+ {
RTS# a( k% k5 R5 J( c7 T* p$ T
ADDR_FFCA:2 ~7 I3 h, X# B5 Q& n
PLA
( C# [7 Z) v7 y# e6 ]: n, T$ Y/ A" B TAY( G# i9 G: \0 R4 m( D7 T
PLA
% j4 C3 T; A: h& o& O9 _9 R TAX9 H; f. K2 a6 i4 e
PLA
, `& S7 p0 i+ Z0 { RTS# K6 j) ?5 x; F) O. s+ c0 U
1 m% [# R, |; J" ]
2 v! X3 K6 R2 T1 k6 x( C$ H; B
) X* ]0 }5 s9 d& {0 L4 ? .ORG $C264 ;自定义的MAPPER2切页程序- E3 a" Z! G7 A+ T. ]+ ^- F
PHA
$ k$ l! o$ J+ h$ c- n( z1 t7 N TXA
) Z, i1 ^- V, A. \8 h PHA
2 m. O: c6 _7 k, d4 C LDA $0066/ c! r# q0 t# \ f7 @9 }
BNE ADDRC2800 v6 T6 \& d2 S6 s& i1 s
LDA #$071 i6 Q2 n* B/ Q; o+ t! ]/ B% o9 d8 j9 a
LDX #$03
$ z( w- A8 H) _; m JSR $CD9B ;自带的切bank方法; V$ `/ M) m- m* X
PLA' T9 K7 U# v% B% P7 F
TAX
/ s; f: d, `8 D& x PLA* s' m9 R( I" J# p' b
JSR $80003 b5 N7 p/ q6 u* d+ e. w! r* T7 ~; J
LDA #$067 G+ R# H y% A* ^# [
LDX #$03
) c, p2 v5 w0 W% _4 }8 @2 m JSR $CD9B ;切回原该切得bank(可以不用)" s6 m# u# p) @6 a9 Q5 q
RTS
3 R* Q6 ]7 s. j- N2 o' Z3 GADDRC280:0 H9 k+ |) j$ K( D# i
PLA
8 P2 m3 a, u" t0 o TAX/ L! ?: f6 e& G" ^7 @( Z: c
PLA& v) S! k, H6 r, `, v8 C. a$ x
RTS8 S' M- f9 @, U1 Q. g" K9 ]; a7 I
- Q/ t) J' o8 K! J
) Q2 X2 _* f$ @! a6 ~1 I, f) o
;[FC][最终任务PPU][END]' [$ A K3 R! S# p, o
.ORG $C056 ;跳转到PPU重写程序
, z: @) H, G6 S* u JSR $7000, D2 m( e8 i6 _$ N) y% m* M+ j
/ {; E- ~- v* f) K" y& j .ORG $CEBF
( R$ D3 y( w2 B) n) Q8 O JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
$ j$ Q! t$ D9 F5 v* V 1 {; p: `+ R- ~- E. S$ A5 x' m
.ORG $E460! `, e6 ^0 T. d q. {; V9 a; N
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入( _4 G5 R/ c% x+ }
/ a: K8 a; ~$ T0 l: } .ORG $71F0% {( S& a% F! r$ E2 A
STAGE_DATA_WRITE:
" x! E# Y0 B/ s- b' M LDA $6010
) ]8 O: @- f( q STA $1E ;关卡写入
- ^+ l S9 L6 U& W LDA #$004 ?) F: r3 r! A. Y
RTS3 B5 |" p8 v5 z! g1 X/ X$ H- a- v
.ORG $71C03 t8 q+ `/ [/ t7 q
BULLET_DATA_WRITE: ;副武器数据写入
- ~9 N+ v X& J CPX #$0E4 G) ?9 H% L+ l/ Z
BCS P2_BUL
3 T s& Y0 g) MP1_BUL:
1 b6 H% `( H4 g3 W$ ^ LDA $6004 F4 U0 \- Z/ n. ^6 K
JSR $D7D0 ;P1副武器数据写入( r6 q) W6 M9 f# E4 C1 ~: E$ j- Y
RTS9 V( f: I8 i( ~# X6 l% t/ a p& w
P2_BUL:" M9 C. C% Z5 [7 F
LDA $6005
/ x. X* j" ]& K+ P2 h [ JSR $D7D0 ;P2副武器数据写入
/ p: l7 n7 P4 b: z r& F' ~3 o0 s! A RTS- W3 s7 h- m) H( @, N
) \0 ]! l5 \7 Y
# ?; u# x; e/ [$ F' D# |" g
.ORG $7000
8 s/ t1 n H( k! m # m+ o; Z) Y' \6 b. ~9 m
STY $4014 ;补上覆盖的精灵写入指令- g5 R& I& b4 I/ ^$ W. F! T
PHA
3 m3 g& b, F0 d+ L. f, O& ]. s TXA
1 Y( I: X, A# i8 T" x) h PHA1 c/ B: n7 |; T _6 T$ I/ W
TYA# O) @" R/ d# f, r7 ? r
PHA
* T4 g$ e' L d$ S+ X9 ?% w9 A LDA $0C8 j2 D9 c, P- P6 ?
CMP #$01 ;比较是否为标题画面. e" Y3 z3 t: F/ n
BEQ PPU_STAGE! W* f9 f& G1 u6 g& C
PLA/ u( s8 g# G C0 {; H4 ]
TAY
: ^9 l( M( F4 U( e. x8 Y PLA4 Z1 y5 `& d* v) W( J* r9 a
TAX
5 U7 S- v: t/ _0 F; n2 G5 d+ t- f PLA9 O+ o* l: f0 G1 R; i2 |
RTS2 q" ?. v* P. F1 L; C/ @ B
PPU_STAGE: ;STAGE显示程序+ r5 u) v' T8 |, a, ]; d
LDA PPU_ADDR_DATA
# B9 y! M7 O M0 F. r5 W4 H STA $2006. t) @# T4 u' L/ U# ~2 K9 {# w
LDA PPU_ADDR_DATA+1' ~. G8 j# A$ }) S9 p0 j1 M. \ ~
STA $2006 ;坐标设置" r8 u9 ^* u |7 t
LDX #$00
; s0 s, n7 O9 V; ~PPU_STAGE_WROTE: ;写入STAGE字模
$ b4 I& N0 h1 u" K8 d LDA STAGE_DATA,X6 G$ E) S; B6 E+ ?( s1 a {, k9 R
STA $20072 C- V/ x; J8 T+ u: \; R% p, c
INX
4 y( b2 u, h; `, N/ n CPX #$06
9 x. ]% d& k2 t BCC PPU_STAGE_WROTE
4 h4 e- f3 F1 r LDA $6010
$ @# T- Z" c1 E CMP #$FF ;关卡数据初始化条件判断
+ {, ]- @2 B2 v) ?$ A, j. Y BNE KEY_B
% W l' ^; A* e/ ^9 @9 L1 {0 m/ N0 I LDA #$00
4 M* ~. j( e3 N% S6 X8 \6 z4 E } STA $6010 ;关卡数据初始化
% U: \8 _4 Z) ?- _5 J9 DKEY_B: ;关卡减少7 b# U2 E {8 q7 _2 p7 b! q
LDA $04% e i6 q1 r6 d+ e0 [. O' S3 B% i
AND #$42 ;按键B或左减关
; l7 x+ A; y% {/ S BEQ KEY_A, b1 h, x, @. U% @
LDA $6010
* D' \, p0 g8 W, B z/ B7 |4 k CMP #$00 ;关卡比较
$ T4 E* ^( C, }* ~. }# ~+ @. _ BEQ KEY_A v% u8 X. _8 x6 m& y
DEC $6010 ;减关5 z# p% `+ ^/ y8 U0 `
KEY_A: ;关卡增加
* S' n2 k& _+ ~ LDA $045 t4 I' T2 u/ c4 s) Y8 ?
AND #$81 ;按键A或右加关% F. w6 |- V1 i( U% h
BEQ PPU_NUM_WRITE4 G6 E3 l, n# Q; Q2 O! L3 M# y
LDA $60109 m+ p# m! f1 s9 \2 f5 [' y
CMP #$04 ;关卡比较
+ D5 G) {4 f6 e BEQ PPU_NUM_WRITE6 Z& X# Y* { \- U7 S2 M0 _9 X
INC $6010 ;加关( J9 o% x- T( Z7 n. x! }
PPU_NUM_WRITE:
3 \/ W: X1 t- u" M2 X LDA $6010& l( }1 y5 J/ {& S2 Y) S; I1 a
TAX" ~. e T& k! \' T" ]- U
LDA STAGE_NUM,X ;写入数字
- J# o, _9 K- b) E- W STA $2007
# u/ }* ?4 C3 z9 g* yPPU_RTS:/ r( {) e- V4 [
PLA
: {1 u* e( R/ n TAY, U" @7 \) Z/ T* x! \4 F( M* K
PLA4 z; C. C! q5 x1 ]4 a `$ `$ N& G
TAX7 l1 J+ u, d4 o4 j3 r- S
PLA
. c6 l' R, ?- j5 I9 d' N RTS- ?7 ]5 r" ?! V7 v& `2 W6 C
' D) ]4 z1 P! B1 r( R 0 Q+ q `1 H+ h
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据9 N4 O: }( D8 {& q
.BYTE $EC,$ED,$DA,$E0,$DE,00
7 a# M% L: S8 h7 USTAGE_NUM: ;关卡数字1,2,3,4,5字模数据
+ n6 q( M; ~) Q/ l6 D .BYTE $D1,$D2,$D3,$D4,$D5
6 b# |. s) |3 m. y+ ?
/ h$ E& F9 n" g* l* V/ a) d9 n5 GPPU_ADDR_DATA:
4 M5 i+ L+ |" b% R .BYTE $23,$0C& v; K5 o* E) @' P
" d5 v( k2 Z- L# `6 n4 j. } |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|