|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
& S8 c6 q0 w+ Y! H1 `9 M' c. A
' J; x4 e4 }' o. j4 k得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.( ?1 \7 _. \3 w" ^
然而,今天想到一个思路.
3 G+ l8 s# w- _* W8 R1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去./ ?$ d3 X! x' E6 X4 N- d
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE9 h$ t% L5 [9 }+ f; f8 `" u8 F
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
# }- a O* y% z( m3 Q8 F; e( y" |7 H& w& @0 g/ [2 q: V
- B$ G9 g; t; Q; ^6 j( ?;[FC][最终任务KEY][END]$ ?. p9 ]; \. t d! @
button = $04 ;单次按键% {8 i: L+ `9 \8 f
flag = $6000 ;功能开关标志
3 C2 e2 J6 @& H. `9 p" M0 s7 ~pause = $000E ;暂停地址
! P. F1 _6 d% w- z: B) e/ l8 z7 q' z
.ORG $8000
# t5 z6 O$ K8 K' w" i# I8 K+ r0 x LDY #$08 ;自带的按键程序# I5 H6 h) k4 H% G1 v% f0 v
ADDR8002:
5 q, l! c1 q; M x6 I LDA $4016,X
1 o8 E1 j3 b0 m# l" E LSR* R5 z: ~% W# B8 X* ?. S2 Y
ROL $0021! ?/ ^9 f: F& ]; w
LSR7 l5 h, W. p) o$ A" s7 [# w
ROL $0029
: C3 W, O3 ^- z- f DEY
1 X' |& n' J1 u6 H( M4 ?* _* R BNE $8002
1 P, v* g5 W' D- {$ g2 l LDA $0021
; P7 g6 ]; C; J/ H ORA $0029
3 J% n! @ o+ \/ e4 ^3 T STA $0021( H/ ]! X8 o* U1 P& k
LDA $0020
* o3 U, z8 Y8 ^/ L& y8 {0 h AND $0021# c1 ^: `2 z5 {
STA $0020" B; M b B! A0 b1 Q( I
LDA $06,X
' n$ T; U& t' y) ?# j EOR $0020# ?; B4 N8 ?1 I# E9 l
AND $0020 ]- Y& h& Q8 p5 @/ t
STA $04,X
, y4 r5 Z$ d1 P6 I1 S! `5 ? LDA $0020
, M1 L: o7 X. K STA $06,X
* m2 U# v" m- @/ F& Z) j1 g JSR KEY_OPERATE
+ m2 l( n6 q* ^9 t4 f# T8 O/ Z JSR Function ;功能调用; J) q ?" _+ _4 ~+ _, D0 z
JSR Weapon ;武器切换调用, G) d3 y0 H/ o/ Z% F S1 \
JSR Power ;威力调用
* D8 I- W f! o! Q" q: R Q0 ?: s JSR BULLET_NUM ;子弹数目$ W \# l0 @/ _/ X6 C( s4 E- z
JSR BULLET ;副武器类型, {" S& g( B# O
RTS/ w, }$ g* ~' Y% U
4 \* i* d# o4 v8 @
/ A7 O- x" ^% W
& Q- [5 V6 |2 F; V .ORG $8050
4 O' o3 Q5 ~; C. v6 D/ ZFunction: ;功能
; O) x- K4 Q- I; hWUDI: ;无敌
8 x1 ?) f* n9 ^: T/ r9 X LDA $6000,X) f5 e1 r' x4 G) m! c: z
AND #$08 ;开关判断
, _$ {: D1 @( \0 [7 K BEQ LIFE
+ [, L7 T% C, L3 n: C6 Z" P0 @ LDA #$05, F b v# e) p6 K1 C s8 U3 Z/ f
STA $05DC,X ;无敌锁定
) p" }$ d+ I7 K7 vLIFE: ;生命0 }5 C( h, a* b. g4 Q
LDA $6000,X
# D, o5 n% X/ j. _3 }3 K AND #$04 ;开关判断, ?3 ?! J: {; h6 l, Z
BEQ FUNRTS3 b- {( T8 r7 t# Q- [2 I3 @6 v
LDA #$05: T% G- ?. A* R% D3 \4 N P% t
STA $1C,X ;生命赋值2 K( S# @, ]: x, {& d/ S3 j: n
FUNRTS:
' J' K- \& B) X9 M; i9 Q RTS
( E4 U4 `, v- r' D % ?7 t" s4 k+ _, |
Weapon: ;武器切换
1 z; g6 w& H( F LDA pause ;暂停状态判断
- R$ B. C+ R5 u5 V: q BNE WEARTS
1 @! I5 F( |- o( W+ w1 N) P6 E LDA $04,X
, [7 h5 n1 C8 Y0 V+ ?9 v CMP #$20 ;选择键判断
: T3 `, o3 ]2 H. B BNE WEARTS
; l: S+ O- R* A. k% v; L LDA $12,X
. y9 G5 v: U- M8 ? \# K CMP #$03 ;武器值判断
$ \9 B8 I+ m2 Q: p; S BCC WEAINC
4 [: u6 o6 M X! C& ?9 E LDA #$FF O' b) Y/ u" `5 w7 k G5 A0 _5 |
STA $12,X ;武器重置+ W1 p$ A, ~1 e4 m& |4 ?$ E) K" O, D
WEAINC:
, T+ J2 F- [ h1 V INC $12,X ;武器增加
7 V. q$ M7 m2 G; A
0 n( v* W) E* x0 L) PWEARTS:6 \+ |2 s+ z# }9 {
RTS i# B" K/ ]0 _0 W
, r5 r {7 D' g! L
Power: ;威力9 g8 K5 j5 H9 p R1 w$ T5 g
LDA pause ;暂停状态判断
2 B) }/ j2 q+ B" ^ j3 }, B BEQ SPERTS
; ^1 Q; P' j6 o7 wBUT_LEFT:
- l% P! ]; e1 i LDA $04,X% [3 G p( o* E+ N. e! S4 N5 d
CMP #$02 ;左按键判断7 R2 B7 d/ V' F+ D* L
BNE BUT_RIGHT6 ^! p0 J7 x! p9 r6 U
LDA $88,X$ w; I/ j9 Z7 Z) Q
CMP #$00 ;威力判断
) n# u9 J/ ? q BEQ SPERTS
( f) G9 Y% l% r. \8 X5 w4 K. t4 y$ VSPEDEC1 x1 D8 N& V& v
LDA $88,X ;读取武器值0 E" k+ i* @, P! r* |: z8 @1 T
SEC T/ B/ S1 ~1 ^# M$ S7 \
SBC #$08
2 y9 ^% i9 Q. ~" m, f4 w2 v STA $88,X ;威力减小" {% `: k* h" @# h
BUT_RIGHT:3 d0 n$ R5 g8 q F
LDA $04,X( u( \6 j; L( _0 F4 k# [2 ^
CMP #$01 ;右按键判断' ?1 ` u6 {# m) [2 P
BNE SPERTS! E" D( z2 N# d/ P
LDA $88,X
, K ^. a4 a* n* i$ h" m CMP #$10 ;威力判断% Y/ y, r1 E7 \
BEQ SPERTS- E6 `( g. b. m
SPEINC:$ P$ u. c a( Q
LDA $88,X ;读取武器值: S' W6 J/ @" e+ u5 w
CLC
# `3 z. B D. S2 \' d ADC #$08& p% D4 x# f F W
STA $88,X ;威力增大
- r0 T, d9 k3 I4 u3 e' p9 [
4 C2 E3 F6 I3 w7 |SPERTS:
% s7 i" c b. ^ RTS
6 b1 ]. _* ?5 Y% e8 `9 `$ j7 ]7 d% z6 l
1 n# a8 p0 C. G& A/ T: u! Q3 ?BULLET_NUM: ;子弹数目) U2 o I6 P% A* {' z. b# X
LDA pause ;暂停状态判断
/ l- o" I7 x2 m% T k BEQ BULRTS
( X2 l+ E2 q. B9 K) N5 {- v CPX #$00 ;主机玩家判断
. e; {0 P0 O6 _& W BNE BULRTS
- X' A2 `4 A7 J6 ^+ R( _/ o LDA $04,X ;主机玩家判断' E7 x" q& m* [2 ]: c, _
AND #$80 ;按键A比较
* E4 u& H' K- `" F3 ]* m/ S5 b* B BEQ BULRTS' [: W9 {; v. j9 P% Y: ^! M H' ~
LDA $87 ;状态判断
- Z; g. Z, c) w* a, s BEQ BUL_2" J% m8 y2 z0 Z) h
BUL_1:
! _% \8 @ [0 Q2 ^, u. C LDA #$00) s9 v" ~' U- N, k, P
STA $87 ;1发子弹
, N8 f* t& D3 i7 m BEQ BULRTS. W7 h& L) D5 ]$ n2 b }$ m
BUL_2:) g, r+ l3 G$ S- e' L
LDA #$01/ r9 k, ~3 }# D! T
STA $87 ;2发子弹
- Q3 e7 A. p1 i . O& h2 s' O. ~
BULRTS:& B' V: F/ Q" ^
RTS
) N% C: Z$ ]9 b( H1 Z4 v + t! l+ ~4 H/ N# h$ f
1 t. U; A1 e& W+ T) u- Z
BULLET:5 k t" Q: ?: t/ ]" X0 F# E+ X
LDA pause ;判断暂停状态
- C5 l6 _% Z$ C0 p BEQ BULLETRTS g9 ]4 T# i: n) Q
LDA $04,X7 `) P* a3 h' `) }5 i( r
CMP #$40 ;按键B比较
5 N: E: k% H u9 U BNE BULLETRTS: A, S8 Z. _# P! I
LDA $6002,X ;读取副武器% P' g& m* f6 O
CMP #$031 y# y0 z& o% h
BCC BULLETADD
M* f3 g& i( _# A: d- k1 [, ~( y, W" W LDA #$FF$ w( i. {+ o, W7 M" o+ B2 k
STA $6002,X
) v l9 `; f! a7 o7 f Z* HBULLETADD:# _# ]* K4 j, g9 q4 i3 V( D
INC $6002,X
8 J4 W3 S" {9 n- E" ]4 D 2 t! ] E5 F4 S
BULLETRTS:
9 H% y% }# m% R4 A9 w LDA $6002,X
6 I& L( U. }/ ~4 u) d8 } TAY1 Z: F9 x1 D1 d+ V9 j8 g
LDA BULLET_DATA,Y' e. l K( H( y! ~( L
STA $6004,X ;写入副武器数据% w# K2 `8 t( s4 j8 j2 o, Y9 g( j4 Q! v
RTS
2 p( d J8 \ D3 B8 Q8 l2 k . o' H! ]+ O4 O u" R t
, V0 c) b$ B5 j
BULLET_DATA:
+ q0 g5 [/ Z0 H) o# F, [" u0 H .BYTE $06,$02,$03,$04" J7 j0 W6 t' ?. @
; C# J/ l8 V* o8 \* H
* j5 D' N; S) s1 R% j 1 g, o1 g/ x5 }
KEY_OPERATE: ;按键开关操作
9 J0 |: E! h; G; o, [5 gdata_protect: ;数据保护' q1 m# y" @* C6 f; D
PHA
7 ?. z8 q' W/ G TXA( d/ p+ M6 a, _
PHA$ J3 y |# n8 W# y4 s, X- N6 f
TYA
6 s/ i4 r1 r" }8 ~; l PHA
4 r+ ^' Y0 ^6 ~+ Z( c8 m
5 ]1 }5 ^6 r+ U) c2 m- z- GFLAG_INI: ;开关标志初始化
& T( Y+ Z2 R, ]$ \( b6 a4 u% t3 p; C9 K0 J$ y5 v
LDA $600F8 ^: g$ Z8 @2 s
CMP #$01
. T5 ^ a, k, P6 C2 w- K6 C; P BEQ pause_cmp( k$ B+ Z& s5 m2 ?. y9 b% g8 ]
LDA #$00
& J6 O# k+ n+ Q! d: U' Y" k STA $60008 O* `1 F1 u: C' N1 j/ Q" R$ X' A
STA $6001
+ W7 s) b$ O2 }' H& } STA $6002" l9 q6 b' ^' h/ @+ F C
STA $60033 o7 f0 v, N; _/ s! Z9 x% ~! ~
STA $6004
, P) \& C) d, K* E6 L# V# ], Z STA $6005
8 \5 C' B9 A z% m LDA #$01# d' C" G# B* s
STA $600F1 G- t9 [% q1 S+ {# V
, h% H6 K+ U) i, t" {$ Tpause_cmp: ;判断暂停状态
6 K* T0 @0 n" w- F5 ~! R# U LDA pause) ?+ U# r& E' e# @% H3 Q; v$ F
CMP #$01 ;判断暂停状态
4 `8 p- t) ?2 b! ]# r, s BEQ button_press3 r& p& _. b8 k& E2 Y0 F' t. d, z- }
PLA) g+ E( u& h4 C4 g/ k- K% c
TAY$ N+ r; a5 Z& C0 q' m/ c
PLA
' Y+ k" @3 h( A7 }! \0 k2 X5 G TAX
/ u" |; R, e0 Y0 ] PLA2 d+ O) B! g7 T( L/ w
RTS
/ U8 d, M9 t, x/ U$ [4 X( q- |' m( a9 p' p8 H' e0 V. D
button_press: ;按压操作
5 x- v3 L# P" Y, _2 I% T' y5 ^/ Tini_Y:
: I/ l3 |9 T: X5 U v& W* M% P LDY #$00
. { j! B! c* v( E, b7 nbutton_cmp:
6 @5 n0 ?4 W$ Z LDA button,X
1 t( g! o0 e8 }2 T CMP ora_data,Y7 n6 S; d8 `) ]. c* }( c
BNE count_Y_cmp
1 g1 S' a, @1 X% Jflag_cmp:$ i7 w3 v n+ e( `5 r- G H
LDA flag,X
8 e3 C$ p! a- _+ N* s4 z8 W AND ora_data,Y
( m( E" C; s) m, K BNE flag_and
. Q9 Q5 ?8 G- b1 _0 ]" Oflag_ora:
+ _' O5 L: a' i1 f: q1 c LDA flag,X% ~8 E! A$ q0 n5 g
ORA ora_data,Y% b. z6 o* \% ?; f5 N( f
STA flag,X$ b: C6 |! }1 k# w3 H) p" J3 P! @
BNE count_Y_cmp2 o. e; `8 F2 N! B P9 U2 Z
flag_and:
) A% z4 C' Q# [& y2 v0 z LDA flag,X
& ]4 s5 [8 {3 Q- l# O; v: y7 J0 w AND and_data,Y0 J4 r9 {( l+ q" [, l
STA flag,X% x, l5 F' d B T7 J) g) A
count_Y_cmp:; ?8 z2 O# B1 w$ Q
INY/ j9 Q* C% h) v4 o
CPY #$08( D" v# q1 S. D. n
BCC button_cmp+ ?+ S, U/ A# v; ~3 t. ]
+ H6 d0 S' F+ h8 R0 m: t, W7 U
data_extract: ;数据恢复" J/ X$ i: Y5 R7 m% l
PLA
2 Z2 b6 v8 a& ?* h% v+ G% ] TAY. R% v0 ^ @0 a6 g
PLA4 _/ l& p; t) O- }& h, w* l
TAX4 v G; i/ a0 c) I/ \0 s# H+ y
PLA' a. J$ X' Q: {+ W' d9 G' k7 l
& C# [, {) L/ v" rreturn:
6 u0 ~3 S S2 m$ R% M' q RTS, O, X5 X: @! z' m/ Y! p
( T/ _$ n$ i" G5 hora_data: ;按键相或数据
% r4 H% K/ W! F. x6 K' i1 J. L .BYTE $08,$04,$02,$01,$80,$40,$20,$107 R7 l* a5 u; b" v: \
and_data: ;按键相与数据
5 ~ \% \; q2 @! T .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
w. A9 i. Y. d( U6 t8 `# J
& A- s) z1 B$ X/ [& \
/ k1 C5 `7 A2 r7 ?0 ]1 O
) n- t5 d& }; b8 I. d ;FC数据搬移程序 BY FlameCyclone2 O, Y) `3 x, D9 V. A
.ORG $82003 h$ N" K: R. y3 `
JMP DATA_COPY_PROTECT
# H1 F; |5 a7 L. L. S
. @. H8 L! E$ \6 g [% hADDR_DATA_TO = $40 ;目的地址+ ]% F) U9 s& u' i
ADDR_FROM_START = $42 ;源开始地址0 h# d1 ~$ G0 r. i6 Y
ADDR_FROM_END = $44 ;源结束地址, |0 ~+ h; l9 W$ B
; i9 K- X* q! F! S
ADDR_TO: ;目的地址
8 _7 Y0 V; P% ` ?- [7 A' J+ F: L .BYTE $00,$70
) T$ u3 |$ Y) }# \3 DADDR_BEGIN: ;源开始地址% O, _' X' B/ b/ v* H
.BYTE $00,$83
m% b; r9 O3 @ADDR_END: ;源结束地址( K/ I ?0 w8 C* ?
.BYTE $FE,$84
; |/ R0 r# i7 P% e' |% `
' k/ D4 W2 |/ ^9 PINT_ADDR = $08 ;中断地址$ p/ r% ?+ A5 G" m4 H$ p
FLAG_OVER = $71FF ;完成标志7 H; W% U) n/ G# a; ]! g) t
0 r4 x5 l+ ^8 ]3 ?2 l
) w5 S) Q9 i! @ ~4 ?1 C
DATA_COPY_PROTECT: ;保护数据/ i+ X" m& b: ]
PHP, M5 {& ]: B2 _) d
PHA
# K& y1 p; i& X6 S9 K TXA9 s ^$ @- {+ g0 j4 o8 e7 U" _/ @
PHA
+ B& B/ i1 F% W' c5 o TYA
" }, z" ~) M- N" v+ q0 t, M! X PHA% e. f" n1 I0 l8 [# u
LDA ADDR_DATA_TO$ i4 d4 X9 U0 w- {& Q: Q7 B- |
PHA
* K3 M \0 R9 N7 b, m LDA ADDR_DATA_TO+1/ ~! G& C4 W/ N) g+ {: A8 c
PHA
/ z6 ~6 C+ i$ M, {! @/ x LDA ADDR_FROM_START
( P6 v' {6 ~9 w( t% E0 J PHA9 [7 i- Q( u$ f! d0 C2 f% C7 _5 n
LDA ADDR_FROM_START+1" P4 C/ `0 H" v4 u% x$ R7 p4 G- Y0 A
PHA5 `8 {9 t* t& `5 }. h
LDA ADDR_FROM_END, |) f" |& a1 A
PHA
- K; x& ^/ u5 n `; s- W LDA ADDR_FROM_END+13 r6 G( H+ a3 F' `3 v; t
PHA) U" X, g) V! K% o# k
$ Q+ f/ [- Y) l! Q5 y$ z. a: fOFF_INT: ;屏蔽中断. z: p; H( G9 L: F
LDA INT_ADDR
) t( l5 V0 M- p7 Z5 u$ v3 g$ h7 \ AND #$7F
2 d" _" M" N. A5 v. O STA $2000 ;屏蔽中断' P; O: r' G% z' [9 Y9 K; [
( x9 A/ ?9 h5 g9 ~
7 `5 Z) \$ [' r; o9 j
SET_DATA_ADDR_START: ;设置复制起始地址8 z4 a7 M* j' h& t1 Z
LDA ADDR_BEGIN
( E* F, Y7 W# p4 `" ]( g' n STA ADDR_FROM_START ;设置复制起始地址低位
' H( P$ \% X% G1 g/ z LDA ADDR_BEGIN+1
5 [. i; |& ^6 Z0 i2 ` STA ADDR_FROM_START+1 ;设置复制起始地址高位# U7 o1 x. v* V! I( b) a
3 {5 d+ X: \7 K6 y
SET_DATA_ADDR_END: ;设置复制结束地址7 L2 P; Q' x# A; I% s5 _
LDA ADDR_END# n) p3 J$ P; }* ]' J
STA ADDR_FROM_END ;设置复制结束地址低位
z" @$ Z' H: e3 r# ~ LDA ADDR_END+1
( x& S* q$ n6 P, X, K1 s STA ADDR_FROM_END+1 ;设置复制结束地址高位
' T1 V' q2 n; t- c
7 w8 Q& ]7 L( GSET_DATA_COPY_START: ;设置目的起始地址
- T6 W$ @' | a( f, s7 x LDA ADDR_TO9 ^( ~8 g; `/ _
STA ADDR_DATA_TO ;设置目的起始地址低位* {- j% c4 }* u8 E' g# e
LDA ADDR_TO+15 a7 D' _" _+ D3 p5 v; ]$ T
STA ADDR_DATA_TO+1 ;设置目的起始地址高位
8 M2 T8 {* j) {5 w# ~ 6 h# ]# B0 c* D, T0 g6 j; I; M
OVER_COPY_CMP: ;复制完成比较
# ^) L7 i; \' V: Y" \ LDA FLAG_OVER. o8 V$ i/ j! k8 m( u% q
CMP #$FE ;复制完成标志比较" L9 `! {/ _2 N) J/ g
BEQ DATA_COPY_EXACT
) j& h! y+ v" |: F( t: i4 i
2 N" U( F! w; k# IINI_XY_COUNT: ;计数器初始化7 M" X" [ X1 a+ n, d* P
LDX #$00+ g6 K, O/ w+ `4 e2 s: y
LDY #$00
# l' ^2 o/ e& E7 x# r5 r d & g- h L+ w& E |3 j) P
COPY_OVER_CMP: ;地址比较
0 ~1 Q+ l) N3 X% w7 X# Y LDA ADDR_FROM_START
8 G. w/ K- {1 m CMP ADDR_FROM_END
2 ]# ^1 E7 e4 [- n4 E E2 ? BNE COPY_START
& h; D8 r* @/ r% u8 }5 b2 d K0 } LDA ADDR_FROM_START+1
& d% D" [3 t# N; z CMP ADDR_FROM_END+1
* n, i; P. L* S/ ~: r BEQ COPY_OVER! e6 p% }( w' Q R2 s/ ^3 ]
4 V/ E5 z; C1 F* ]! Y; J4 A j
COPY_START: ;数据复制开始
* B" h- {+ c' D9 T LDA (ADDR_FROM_START),Y ;读取源地址8 n9 a0 T# @ h. s( C U
STA (ADDR_DATA_TO),Y ;写入目的地址
. `3 P( j8 I s ^) R% } INC ADDR_FROM_START ;源地址低位递增; m1 T6 r3 r8 z8 u) \: N
INC ADDR_DATA_TO ;目的地址低位递增8 t# C$ B$ W# e% M9 p* {
BNE COPY_JMP
4 Q' ]7 j2 L3 S' G$ g- R3 k INC ADDR_FROM_START+1 ;源地址高位递增9 `" ]: h' f* I
INC ADDR_DATA_TO+1 ;目的地址高位递增& i" f d& a) _$ y( U- f
, ]% k6 H, r$ c! \! j! G- D5 i: F# L
COPY_JMP: ' k9 I3 K+ `6 V( a- G/ Q, R
JMP COPY_OVER_CMP6 m" h4 y3 G/ g$ ^* ~& M/ r2 F
) _6 R7 A& Q2 g9 W& `1 M. @COPY_OVER: ;复制完成
5 O% k' y' L. U LDA #$FE
$ [- j, v6 n9 ~" p STA FLAG_OVER ;写入完成标志) l3 d- b0 |+ Q
FINAL_BYTE:* Z" e# u3 B& y! F4 @" j' ^
LDA (ADDR_FROM_START),Y ;读取最后一个字节
# c/ x9 q: G1 K m( M STA (ADDR_DATA_TO),Y ;写入最后一个字节( r3 j6 o1 ]9 W! t" ~6 u1 ^3 u
0 V/ O# Y7 u1 e& V0 H+ fDATA_COPY_EXACT: ;恢复数据
l" i/ H R8 w LDA INT_ADDR8 Y% |% L) l' |/ y
STA $2000 ;恢复中断- D7 R. {/ B) O+ c) A
PLA U5 w5 P5 J! `2 t1 q
STA ADDR_FROM_END+1
6 x/ k- B7 v6 N! J9 q% D6 @ PLA8 x$ W# B$ i5 l3 C& @& f% G
STA ADDR_FROM_END
! a# i& r2 @) R. n5 k& \6 n( h PLA0 c1 j D( P8 v8 @4 r; L! `' h
STA ADDR_FROM_START+1
9 W" N( Q7 ^9 |5 | PLA; |% b: ^+ ?+ U, i% m; W
STA ADDR_FROM_START
2 y# i" S9 q6 H, S5 @ PLA
. x0 z' v, ~+ Y w2 B! S STA ADDR_DATA_TO+19 j$ _- U: \3 q9 {) u& r6 g8 q8 ~, k0 n
PLA
4 n" X/ C5 y2 d- n2 F STA ADDR_DATA_TO
. b; e+ A3 B) x: z! X2 s" d PLA+ K5 g% u @$ D& f
TAY1 a3 r J f: S2 Q% x0 ~
PLA
% o# ?8 L0 I. N1 V% f0 W- M) a9 X* q TAX- s5 v8 Z8 m; }
PLA' Y; h. Q1 ^$ s: @0 ^
PLP
2 V6 F& _- b E x( k* p4 @9 w: O5 X8 b7 Z' p
1 z' Z7 Q2 q! t) O# P
( _6 @. V% C8 g# hDATA_COPY_RETURN:
2 @5 H& Y h) P( G* u5 l5 K3 n1 _" R RTS
, Z$ T1 L) [* R; n% H2 u: u
7 c9 w# q' `: _' n9 d- l .ORG $C056 ;精灵指令覆盖
+ T/ G( B$ W/ R JSR $FFB5
9 {& r; p1 v' R 8 H8 r2 y+ t7 ]' I! G3 K; H. q e3 O
.ORG $FFB5 ;
' T( H7 c& T/ M6 c" c8 N PHA! `' K) V* x4 R* Y
TXA
. P' k' A( J3 s" Z. p PHA
; s9 X2 l( W5 U! M. U TYA
3 O, {- S! b. ~" ~7 O) Q7 Y* I PHA
6 X- @+ D2 V+ G1 [5 l8 u" A LDA $71FF ;比较7000-71FE数据是否完成复制
" D; ~4 k. w: ?5 {4 i4 c* R CMP #$FE
* w" U8 U% }' ^' F3 { BNE ADDR_FFCA
1 B5 h ~1 Z d9 I' `, G) ~ PLA
& o1 e0 G4 `! B1 _1 m% M$ b TAY! a9 _3 _6 x2 p1 Q* s+ K! n( r2 |
PLA
0 X" B4 k5 X) a. s5 I5 u' | TAX4 W8 m, g' |& d6 P0 j1 w$ y& H
PLA
9 o+ ^) {7 Z9 Z& p0 X5 s! z- [/ U JSR $7000 ;跳转到自写程序8 ?3 I$ d- M8 E& t1 I; `4 A
RTS
g, F7 }8 Z8 K% \" X4 b% f, `8 SADDR_FFCA:
( a5 b# w, `9 ]0 X' o2 {" w, t PLA
3 p# L, `7 P/ N9 t5 J3 H1 R TAY
L% e0 h4 H C' L+ U5 @ PLA
8 G. O, R' ?$ e TAX
* m$ a7 Q$ x$ B PLA; Z) g( U3 v6 s' J+ p* s8 v( ~
RTS1 q, O1 g2 E2 D- A
: e- W2 B' }! L2 h
$ |+ k$ f. \) |. @$ g4 w
" w2 P# N$ [. r- A: i .ORG $C264 ;自定义的MAPPER2切页程序
3 q4 t0 s$ _, o+ C$ R PHA
- ]6 f( {) J4 h4 Y4 M9 ] TXA
, o1 d/ g4 S3 X Q. D$ ^: W. r9 d PHA) o/ L M7 x) F% |4 ?
LDA $00665 V: J- i% b# W' @9 @5 {
BNE ADDRC280; s$ r( ], P5 x& u
LDA #$07; E! @! L: K8 U& X, r2 s
LDX #$03
. f3 e) }* ?( h7 G2 Q0 G! K! x JSR $CD9B ;自带的切bank方法
' {9 c+ S& d1 T3 v$ r3 j) l( X# ?. G PLA
# V# M! D; \; [0 a5 e Y8 k. z TAX
/ y% J' N) B$ J/ b) ]- Q5 [) k PLA
* y0 ^& g0 D" Z0 }/ e% @ JSR $8000
. Y5 _& k6 v" ?) O) L8 k LDA #$06
# V* H* _# q2 e6 q, `. i2 ^& X LDX #$03
* E" Y9 |! n* L4 D' j E+ ^ JSR $CD9B ;切回原该切得bank(可以不用)
* R% |& t; W- O) x" K Z7 N RTS
/ l0 J' P2 P# R: K" vADDRC280:& a! M8 Q/ v h" V8 s& }
PLA
$ P# _) r. F; f, Z TAX1 p0 i9 c) N2 E2 A% L" o) P( G
PLA
, S) p; F! ~. o T) X! `2 j RTS
" _) r) E5 a7 E0 N& B3 f# ^+ Y9 t 2 a7 z/ m+ k: }2 V5 q2 c
+ s! u! b0 v% U; Z1 D& k' D
;[FC][最终任务PPU][END]
, C* M# R1 Y8 D9 Z m; v6 X- v .ORG $C056 ;跳转到PPU重写程序% y% [" q7 E3 p- N4 T2 H
JSR $7000
- d$ b8 Y% H; `5 f. z1 ?6 N. x R. h" U5 _
.ORG $CEBF8 K' S( I6 a7 W4 @1 W2 {
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
3 S! E0 b! Y, A6 {5 Q) R 9 l9 B* x6 M* o
.ORG $E460- a% M. g- W* v! X
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
4 b7 O7 x( b# t9 V, q
# f# `( }( l! p# d .ORG $71F09 u' W3 l6 |$ p7 B
STAGE_DATA_WRITE:
6 J9 ?8 {4 I. Q% p: _; S4 a# |, t- j LDA $6010
" Y2 O; {7 ?6 g STA $1E ;关卡写入' K( }4 \4 N/ [& b0 j8 l
LDA #$001 s' k5 c4 f- q8 T
RTS8 D u+ f5 ]9 w! |
.ORG $71C0
! V0 t. `8 C ?/ o( rBULLET_DATA_WRITE: ;副武器数据写入+ W6 V* S2 `: v; P
CPX #$0E
$ U$ r* U/ B" b- ^, L4 Q BCS P2_BUL
) Q0 ^ A3 {1 ~; t7 L/ DP1_BUL:" p H9 r2 s. v0 {3 ~- c
LDA $6004( Q' x* S" ^6 e$ @ A
JSR $D7D0 ;P1副武器数据写入
$ q: \; \3 C) _. \' G7 i6 D RTS
) h$ c7 k7 R- ?' G5 j, l6 FP2_BUL:
: ?# }( j3 \ I; s. e0 N LDA $6005$ H3 v6 T& c8 ~$ e$ ]5 g" a7 A
JSR $D7D0 ;P2副武器数据写入
, g( u7 Q* p2 Y( }+ l9 x RTS
2 C. _; s9 O9 J6 P _( |8 I. x7 ]$ ~0 e) n9 U
3 g9 m7 V& l" A6 S0 d6 W
.ORG $7000* O: g. U. |' G ^/ B; \( ^# w
1 }( c# ~& q, E3 t9 `% K* | u STY $4014 ;补上覆盖的精灵写入指令
, K$ d$ C/ p8 s+ J& Z# x PHA
* {1 q" f% o. Z TXA
" r/ B$ B6 Y3 @# P PHA6 M5 {+ }- Q) Q8 I# V1 {
TYA
( z; l! O, K$ { PHA
: _ t H( r& v" v# P0 x LDA $0C
/ Z( s& Z( i5 T/ W5 W CMP #$01 ;比较是否为标题画面
D/ S# @6 x+ g# F6 E8 l BEQ PPU_STAGE
- j. W' \& ^% q* z0 _3 \/ \1 G j PLA
# e& ?* J F: ^6 Z6 d TAY
; D4 d/ n4 E' p& M; [, [ PLA
& x0 u, { W7 i" B TAX
" @6 ^) |: O0 a9 A9 T! J' |9 h4 |3 S PLA
9 r% N% R2 {9 I8 _" N RTS
* Y1 g# [4 ?: UPPU_STAGE: ;STAGE显示程序4 X; x& F! @% n. t$ B6 B% ?
LDA PPU_ADDR_DATA+ ^6 b/ P9 p" Q) |: W7 U: o' J
STA $20063 y% r" U* S# U2 _0 I' C& Y
LDA PPU_ADDR_DATA+1. V5 {/ K+ y1 F# g" d
STA $2006 ;坐标设置3 X% _( |/ z: k9 s
LDX #$00
4 c" L @. N: y- ~+ i5 ~' O" _PPU_STAGE_WROTE: ;写入STAGE字模0 S0 g" `6 i+ @4 t" I/ W
LDA STAGE_DATA,X
3 F }) ~3 h5 n* M+ o+ e y, G STA $2007
1 o9 s: h0 W2 a6 K& w9 O: ^ INX7 D* c$ T4 t4 V7 L
CPX #$064 m; L) S. d( {4 {
BCC PPU_STAGE_WROTE
$ ~9 D& t2 Q& {9 t$ D% x LDA $6010+ C. \/ Y/ ]+ @7 z( h
CMP #$FF ;关卡数据初始化条件判断& @( e$ W2 Q& Q2 k8 c+ P
BNE KEY_B
& n# R% L* \+ Y# ^* D L& M6 X3 N) W LDA #$00
* w: L6 d+ M6 O+ j4 I STA $6010 ;关卡数据初始化 t- m0 r$ I" g
KEY_B: ;关卡减少
G7 N( X4 b4 N0 b, K LDA $04, i* o% I0 O- ?, N' T: A( |
AND #$42 ;按键B或左减关
: Y8 n" `1 C: t BEQ KEY_A
5 i7 D0 [7 U7 c1 r! ~9 o/ ] LDA $6010
3 N4 \5 `0 \7 X8 X9 B* S1 v3 n3 O CMP #$00 ;关卡比较) i5 {3 I; L% J/ w/ z
BEQ KEY_A! D1 _! Y, O- ^2 W# S' C% b9 h
DEC $6010 ;减关
( n1 ?& n- S3 F6 sKEY_A: ;关卡增加
* ^2 V0 I+ L( M" |5 ]. w" B, ` LDA $049 }5 ~: N( I8 A7 ~+ X: ?4 A- W0 d& r
AND #$81 ;按键A或右加关
7 `, C: T, G T9 b BEQ PPU_NUM_WRITE
# M" w c- r$ o, {8 F LDA $6010
7 {- R& K+ ~% U# P2 G) t CMP #$04 ;关卡比较
5 z* Y8 K/ p q+ [ BEQ PPU_NUM_WRITE
9 ~! {! b' P4 s; Y/ ^# \ INC $6010 ;加关1 ~. N$ x1 B: E3 s* ^- L- _- `
PPU_NUM_WRITE:
3 E4 V8 v. S7 B LDA $6010( N) B: b4 R, v) Z, [- r7 g& b
TAX
- F( _$ b+ ~. {2 ^ LDA STAGE_NUM,X ;写入数字+ q) ~2 W/ V5 ~1 s2 A G0 }( R
STA $2007 \9 d- j- q! Y; w. U
PPU_RTS:8 a: _6 U" v; [& U" G" ]6 {; r
PLA
$ j2 p- |2 s3 x0 |9 |6 j TAY1 n! B" M( ?: d6 u
PLA% T: [: f8 t" p4 u
TAX
7 q9 P$ P# M$ ]0 { PLA
8 Y/ I9 q% z* k6 p4 s! m RTS
/ U5 q* q6 l1 y/ k8 g6 m
8 Z4 x9 T3 x3 P( F$ J( m* e - ]0 W( W9 w/ n$ D
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据0 ^5 I% d; `3 o% D9 r9 ]
.BYTE $EC,$ED,$DA,$E0,$DE,00
3 B1 Y$ Z- L* b; SSTAGE_NUM: ;关卡数字1,2,3,4,5字模数据
# |9 L3 C) [5 O' y .BYTE $D1,$D2,$D3,$D4,$D5
5 o+ u6 l. _+ x* A- d. N* n ) O; f9 H/ @: E }, ?* T8 ]
PPU_ADDR_DATA:
- F+ W9 V- T6 o4 b9 r .BYTE $23,$0C& W% P! i- J2 Z# Y
& G' T% I0 A; w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|