|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 / e" Y9 L% [! Z q* f, d" L
* ?# q& d3 l# N
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.5 d# x5 ?: ^0 u, O5 l
然而,今天想到一个思路.7 [0 d$ b* j7 v1 S2 @# A4 w. @
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去. O4 o6 U' y2 T6 Y& k7 n
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
- t" o; [- O2 s3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
6 w6 @6 s/ y5 b! B0 l X9 W( p$ x4 F0 G1 s
3 [+ A) i+ N$ l. E" `" M
;[FC][最终任务KEY][END]
6 z. w; I3 } {6 r" S/ [button = $04 ;单次按键; m) H/ o1 s* n# ~7 W' ~% b
flag = $6000 ;功能开关标志
* g7 a: J9 o9 Rpause = $000E ;暂停地址
3 B! A, Y1 a. T% l6 d; s; e, S5 m9 D0 C# ^5 Q/ J: l2 \
.ORG $8000- |1 y9 \; ]6 n8 m& l3 e V) F
LDY #$08 ;自带的按键程序4 c2 v% L, g; ^6 {% [. I
ADDR8002:
- R9 U4 s& r- W+ B LDA $4016,X7 p! L! ?8 M- q P/ t
LSR
|! ]* L2 C- h: w7 ?: n' I- V( | ROL $0021: q2 v- W! ]( d9 g, O2 \/ H2 L3 H2 c
LSR
. b" y4 p: T, z. F( ~ ROL $0029
5 x, f7 A# m! O: V8 i2 Y* W I DEY* r9 t6 k8 D/ f8 `- l
BNE $8002
* j1 e2 d7 d7 \2 q& P _ X7 D LDA $0021! P! d8 u5 Z1 V* ?" o
ORA $0029
! Z( @+ @# k6 k6 g( i8 o' f4 u5 b STA $0021 [' J3 w+ c$ F& P1 @- f
LDA $0020
, G: G. @' f5 y* D AND $0021
# n% M) l/ }+ D/ p7 q! z: Q STA $0020
' t4 o" _, `% l `& r# R7 ? LDA $06,X6 ?0 d4 Y; c: Y" p. E$ t3 G
EOR $0020
* o; A" [3 W/ }( L( W: m3 q AND $0020' H" [+ }# r& Z; }/ N e* |
STA $04,X+ }2 r, |7 d& u0 V
LDA $0020, d! I8 W$ ^- W
STA $06,X
6 q8 g Y$ f3 t9 k) m JSR KEY_OPERATE
6 l; y) Y# b! U* i JSR Function ;功能调用2 _# D' @! B- B1 m4 g* M
JSR Weapon ;武器切换调用- F* E% ?. A1 p9 v7 S' _/ P. g
JSR Power ;威力调用
# m: ` l% J* m$ _ JSR BULLET_NUM ;子弹数目# M# _, g% d" K) C3 B4 r" D
JSR BULLET ;副武器类型
! {9 c- A( k8 b4 L RTS2 E! q# k6 `. m% F" y( I7 w0 N1 \
/ N3 a" y6 m2 E) M D# i' @4 H, S
0 W# c, c1 D5 Z" {( [. {
6 R+ }, r7 i( l' v .ORG $8050* a% z6 V/ @0 N& b# T8 r/ f: g, Y
Function: ;功能
) \2 z& \3 l$ s! h4 M1 OWUDI: ;无敌
( \3 @/ Q, e) r6 i LDA $6000,X9 k5 W) a, U4 c/ |( n
AND #$08 ;开关判断
6 E* r* X' y0 V' R) d' i9 } BEQ LIFE1 e9 ?4 I3 Q; z# y- q
LDA #$053 y; g. F8 A+ @" u# [! q
STA $05DC,X ;无敌锁定
; x9 |9 Y& y `$ |LIFE: ;生命
7 e( x/ y6 ?( Q$ M LDA $6000,X3 r3 R" v; s7 w7 }
AND #$04 ;开关判断1 Q8 @& M; `5 {. i
BEQ FUNRTS
3 X6 g+ B, J5 }+ _ LDA #$051 _( f; x2 h8 [( W% k- J" Z7 f! {) T
STA $1C,X ;生命赋值- w4 |3 q7 G- t0 ~
FUNRTS:
% a( m( \6 I& M. l) y$ ~' Q RTS8 L6 ?! |4 v% J. J9 _
4 T7 m& c' f2 |, l0 w# g
Weapon: ;武器切换& D1 U5 N7 t3 q" r$ T- r
LDA pause ;暂停状态判断9 [/ v8 w4 `2 y* `( R
BNE WEARTS
; L0 I$ [1 Y4 v5 g% B2 Y; C LDA $04,X; R0 u8 W) J- w7 \ P: U4 z
CMP #$20 ;选择键判断- _) r5 T5 b0 J$ m7 @
BNE WEARTS) b) A. F3 N- l/ p& ]
LDA $12,X
& H$ O, n/ j; o2 M' m+ H4 V CMP #$03 ;武器值判断5 V5 k5 ~* y: B& j& C
BCC WEAINC" e7 w& X/ _( L, i1 E7 Q4 H
LDA #$FF* |* j9 j' P* E' ^+ A9 o9 o/ ? `
STA $12,X ;武器重置; [, I7 {, M; V& P5 F4 ?. u
WEAINC:/ |$ I7 b# S" X- q* R8 W
INC $12,X ;武器增加
N8 T4 i% t" o( P! x ( o6 L5 G" P x' Y! L0 R( `: d
WEARTS:( m8 w8 B& [( {3 [# C% y
RTS; ?/ P K. G: a6 Q
& E/ r b5 J8 j: g! ^# w+ ?
Power: ;威力* C, e2 ]: P8 X1 E d) N7 _
LDA pause ;暂停状态判断) @7 a0 f; a+ G& A1 T9 M/ e0 e3 z
BEQ SPERTS
" k& g: \8 I& d0 hBUT_LEFT:
- @4 ^8 K: @8 o4 A LDA $04,X
/ U' j6 c- |- h) X CMP #$02 ;左按键判断
4 b6 r" X7 x' T7 F0 @ BNE BUT_RIGHT
5 K U2 `$ c3 \2 U6 y LDA $88,X, ?, ?9 f9 }; f) k ]! s2 a9 e
CMP #$00 ;威力判断
' N" r$ Z7 s: o& C4 I/ L BEQ SPERTS; G% x; r; t# e
SPEDEC, c* W: r4 y& Q: `* ?- n
LDA $88,X ;读取武器值
* O3 a+ p+ M4 S* ` SEC
# r/ c5 ]( n! Q- _ SBC #$08) t6 r5 d6 L$ p* E7 E0 c
STA $88,X ;威力减小6 b* k! f3 ^: M' O
BUT_RIGHT:
, k# R8 i5 R+ N7 ?7 i) s LDA $04,X; t" C' Q8 {/ l3 _
CMP #$01 ;右按键判断! I" X) K* D# z3 D, z7 @" B
BNE SPERTS
3 f, [2 R3 O& k% k LDA $88,X
% {* L2 ^# N* e2 R3 C3 k CMP #$10 ;威力判断( O7 ]+ M& a3 t, f( U
BEQ SPERTS9 |& s) e: y$ A& q- v
SPEINC: a, T+ t0 W2 W/ o; i' J" c
LDA $88,X ;读取武器值
V$ R6 A- Z/ a6 ^* w- w CLC
. c* l! ^0 w$ S" w) A- U ADC #$08
0 `; a0 u9 j& s5 B* ^( C STA $88,X ;威力增大
! P, d3 o5 Q7 \) P9 ` 9 o' U8 t5 d# w8 w- S; |5 M
SPERTS:/ @- ]$ L" t8 G+ h' g1 ^
RTS6 x1 e# U: N \! n, o& s8 N
" ]/ L$ C9 F6 i$ J( y+ `BULLET_NUM: ;子弹数目- v# W. `* i, w1 u& F! m
LDA pause ;暂停状态判断
4 _$ i. T6 P7 ?. H9 S BEQ BULRTS; x# Q! L3 k: ?% O' ^
CPX #$00 ;主机玩家判断
. s- h0 a1 g# t- g/ ~. v3 J9 Q BNE BULRTS
) E3 s: B- s2 E8 C LDA $04,X ;主机玩家判断
- i( q. K2 O& L5 O/ M# W, x& a0 i9 o AND #$80 ;按键A比较% m9 n' t3 }- ]- }( I. _/ x
BEQ BULRTS
7 K m h9 U+ `3 u# q6 X! [ LDA $87 ;状态判断
, s# ]5 N, |/ N$ [( F* ~5 w BEQ BUL_2/ G$ D* X5 ^# d z$ a8 }% t
BUL_1:
6 \" S- K0 z9 r7 U& B z% e! N# d8 _ LDA #$00
0 l1 N9 ?4 o" @ STA $87 ;1发子弹
5 @7 J; f& `+ ]4 ^ BEQ BULRTS
' w( @& x- {% B2 QBUL_2:) w. C7 }: s$ b T8 O
LDA #$01' S" ~! l! w7 Z/ j* |4 Y1 R
STA $87 ;2发子弹! W: K5 y) R( n3 p1 l
' X K/ X7 Q% b3 s. X3 E
BULRTS:* o5 S3 S/ X9 N
RTS0 _8 Z9 e: ]0 D) A" v! S2 ^
0 E4 u! X1 G4 r9 l2 d5 e5 l
( a. s" g4 H |2 L& \BULLET:
/ l+ r3 f' x R" n, x LDA pause ;判断暂停状态/ t% `+ {. q6 E1 g O2 W
BEQ BULLETRTS; b% \ d% ]9 {- O5 d( q- e! @
LDA $04,X
9 Z; {6 d: V0 z/ @. k: @; M; J CMP #$40 ;按键B比较* n$ {- e3 Z2 S6 U& Y, R' w
BNE BULLETRTS) v6 }3 d0 M: }. m1 r& D! f9 L1 z
LDA $6002,X ;读取副武器) Z% u8 Z, v* a. }
CMP #$03
1 h* R$ j$ |8 F$ O' o BCC BULLETADD
; e) j, u9 i3 O' N8 I* y LDA #$FF/ ^/ b, w1 r/ j$ q
STA $6002,X
. p9 T. a( Y( B! qBULLETADD:- Z! x1 I3 n3 P' n
INC $6002,X+ U m/ W# X, l7 J9 P4 o2 \
4 s* g+ Y* U |9 C0 j4 OBULLETRTS:8 _8 B1 }+ ^' |. N, m
LDA $6002,X2 E/ A0 }( d- d8 _3 A( U+ o. D
TAY( G, k+ O+ _$ N" z
LDA BULLET_DATA,Y
6 ~" ^( q8 y- B+ U# B2 Q+ V STA $6004,X ;写入副武器数据' [) j* x0 E( c' d8 h
RTS& w1 m) k7 Q; H( @' o1 z' K
, p! |6 N% b2 \( J
5 n- {2 z: ]; G; z0 K) ?0 WBULLET_DATA:
A; s' n I$ H r% Y .BYTE $06,$02,$03,$04
4 U( w, A+ S' S7 Q
8 ^6 }$ n0 ]; o! {+ E8 X8 ] U& `
9 |. v' a' O! V$ w/ T1 a0 g7 r# r
% e0 h3 Q; \, o" V# ]! Z5 C. EKEY_OPERATE: ;按键开关操作
1 v4 E! w3 t }2 Qdata_protect: ;数据保护
6 [9 J6 F( \: j) z( z5 B) ] D7 t PHA. \9 Q! b, J. \8 I& E
TXA' m) B+ \! ?7 `8 R( d; R
PHA
; o0 Z8 _( u* D0 \3 I" A! F TYA/ N3 q2 m9 l9 U2 X
PHA
9 d0 ~ ?! k3 f/ w2 c8 C5 D ~) Z, A
FLAG_INI: ;开关标志初始化
: p: ?( U9 {( ^8 k4 M/ w" S; w% n8 A2 r
LDA $600F9 F6 N, C; n% d" b% [* z" @" v: N! e
CMP #$01: d0 P4 ?4 S1 t4 m3 C g
BEQ pause_cmp2 `4 F$ h2 A1 H2 A4 J1 r: A
LDA #$00
% J$ ?. g' M* ~+ a) m STA $6000
: C1 W: R$ z. r6 I% s) d: K: i STA $6001
( ^* y) `" n8 {* ] STA $6002- A1 f6 T* W2 T( O) m% ~ u! g
STA $6003% p x/ s: c; Z0 R4 ^7 e3 h2 i/ X+ \
STA $6004: B& \9 b$ ?9 t" o9 u, o* _( ?$ r
STA $60050 f* d7 a) A* ^( W
LDA #$01
$ q( j4 T7 n! \7 P STA $600F1 u- Y/ O1 v/ _, V
( l( o) f0 H2 U0 X+ P# Y
pause_cmp: ;判断暂停状态
3 S" @( _5 T4 [0 E LDA pause
3 ?, s2 w3 S5 y CMP #$01 ;判断暂停状态; _1 W1 \% }4 [% u# o
BEQ button_press
- Z i$ B8 C# s6 M' t# U PLA
8 I" i" E2 w$ d( }/ Z( M4 N, C TAY
# h) C2 A. {4 g5 y% W" w. C PLA* X0 u3 S3 b4 Y8 g }; w
TAX8 ~) }6 j' y x* O
PLA
9 j' T. W! K7 S3 |4 `' e RTS8 {6 [& D8 S* F/ Z) j& j+ f
8 ?% E2 S0 \, R' _$ Xbutton_press: ;按压操作
q5 d0 t7 v( l5 k* E7 Fini_Y:
6 }, f" g+ v! y; @1 s% V! @8 g LDY #$002 R* `0 N2 u W, \5 a
button_cmp:2 P s; w$ a1 i4 R5 A7 k2 w! h
LDA button,X
: g5 o( p1 W4 u q$ w* X9 X CMP ora_data,Y+ g" L b D( w* o5 N9 ]4 t
BNE count_Y_cmp9 l- E) f! Y& g0 l, D
flag_cmp:
. S: N# b( }. L7 w" \9 W6 w LDA flag,X4 K3 {% d& R6 h2 H+ f9 X
AND ora_data,Y$ K) ^0 d* U C0 M
BNE flag_and
' k/ j8 y! z4 k1 S5 Pflag_ora:
) \" U$ E! r! @+ d5 J LDA flag,X
$ v3 q3 p: M' M, O8 K: y ORA ora_data,Y3 q) m+ _ T9 j+ }% ?+ ~
STA flag,X; H: Q3 v. r% Z& ]
BNE count_Y_cmp
! |+ }' @+ H; M8 D% Mflag_and:
, L# w4 ^6 d, k, E- n LDA flag,X
' s1 Q: m! N6 I' q& {& T7 Z4 k AND and_data,Y/ x* c7 J) K: X5 i6 i% E
STA flag,X
3 w' n; A* n% G7 \' K, S7 h) V( Dcount_Y_cmp:$ V+ [0 H7 a8 C( n* M
INY6 d2 [7 s( c' p
CPY #$08
! G% O& b* d& w( Y( j BCC button_cmp
/ {& U2 r) A" i9 R
/ C6 ]3 Q0 P" ?" |/ T+ n7 F. o8 ydata_extract: ;数据恢复' t# `- M2 t- n$ T& I1 f7 [
PLA
- p2 r8 p2 {2 z7 G TAY0 E" |$ ]( G8 D2 \
PLA/ M: W2 R% g; e' ]- ~
TAX
( z, y% j( @' Q- t0 a1 g! v PLA* }; Y& @3 E$ N, C
* n8 o* u) r+ h* J+ C- preturn:
) J7 O8 O, P# F! Y- Y% H: ~ P RTS
7 z4 e* I. O2 O' p) E" q: T$ V! X + a$ q0 {3 p& [" U2 i) W5 a% [! [
ora_data: ;按键相或数据' U: C0 V4 s8 [' E) n7 v/ b! }
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
+ o% }3 d/ N! `- qand_data: ;按键相与数据: k+ I, v0 k/ ~3 w
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF. ^9 f) |/ ]4 Q" ?6 C& o
1 K& P! |+ G- N* t: X. W! W, ^3 i1 P " u6 w" w9 y! I1 J, h8 l
% c2 O# T- ^! V5 u" B" G5 g0 ^+ a
;FC数据搬移程序 BY FlameCyclone J! T2 C& y& T' p
.ORG $8200
+ V I! L, h3 X3 x& M1 M JMP DATA_COPY_PROTECT
K1 W. X/ [! g# A5 B0 o* m% S1 t6 j3 M2 A" ]0 y
ADDR_DATA_TO = $40 ;目的地址
4 b$ ~3 _: G- b- e% a) Y7 bADDR_FROM_START = $42 ;源开始地址 C0 v4 C6 ^4 M( ` q3 V/ Z# _% k
ADDR_FROM_END = $44 ;源结束地址
7 |! e% ?* y: D. W- a. A
0 r; R' S# k5 ~3 ^ADDR_TO: ;目的地址4 o- L- n# `; g- r
.BYTE $00,$70
$ r% u7 a% w* ^9 G: s' U$ LADDR_BEGIN: ;源开始地址
$ B) ?: o b' g3 t9 b/ z: r& x .BYTE $00,$832 C; h3 s, y2 @- g
ADDR_END: ;源结束地址$ y5 e9 F8 E) U
.BYTE $FE,$84
/ G! {& e# R8 y( B: I% l( q5 k, X$ D+ G/ k% A& T( W; p$ c& _0 `1 B3 i
INT_ADDR = $08 ;中断地址
% w `) m9 Q" C1 n( }FLAG_OVER = $71FF ;完成标志
/ j8 |. m& ^/ I; d3 u+ A0 O& \+ N/ ], w7 J
0 Y; ~. A, A9 m+ {DATA_COPY_PROTECT: ;保护数据
# N: C( Z# e; ?+ m6 `, Z: V0 N PHP
+ t' h8 ?0 ~" w9 j6 @" a! B PHA) g3 w% _! V: H, \
TXA- I) b, I' X x! H1 v9 n, k7 |
PHA% y, |: ~, [2 _2 ?' S: }
TYA6 }) V/ W6 c) Y& G7 k5 R% L
PHA: d% X b4 o2 o
LDA ADDR_DATA_TO8 _5 `1 F9 c" s) [% b1 `
PHA
" m: ?3 |! e* b8 Y LDA ADDR_DATA_TO+1) u3 c9 | J ^0 c5 k' v
PHA& O; f1 I I2 j. `
LDA ADDR_FROM_START, B0 \1 h/ s' Q3 Y% u' L W
PHA/ J& M" E2 k' I) _% L" \
LDA ADDR_FROM_START+1
3 J7 `6 x3 K! S/ P PHA
8 n* F* @8 p6 i LDA ADDR_FROM_END. P" m" y6 U, s Y: i' l
PHA5 \! T q1 I/ @% j
LDA ADDR_FROM_END+1
+ m5 i. m, g# _' T' L2 G. U" m. A PHA; ^$ w3 f& I! N& ?3 v5 q: n. c
" F" |. ~" G! `! C9 L9 C& ~
OFF_INT: ;屏蔽中断* ?) b5 z. u( c. z' ~$ v8 n/ d
LDA INT_ADDR
$ q, C; h; f: T; z+ S# v AND #$7F# f. O T8 u" ]' S9 b* h+ [- Y1 J
STA $2000 ;屏蔽中断
, d/ H5 d) t. p, B& \! W+ t' h5 _& O4 Q1 N. j0 |
& V5 I; n4 C4 f; g4 M% ^' d9 G# N
SET_DATA_ADDR_START: ;设置复制起始地址! W ]& {# I" I) O" \* t' t- d
LDA ADDR_BEGIN
6 \& V5 l* D2 d' k STA ADDR_FROM_START ;设置复制起始地址低位* K& `, ?9 l7 w, Q
LDA ADDR_BEGIN+1# p, i' Z: C3 l ~
STA ADDR_FROM_START+1 ;设置复制起始地址高位7 ^/ K. X9 X6 b. ^# P/ N2 `
% n Z0 y& |6 hSET_DATA_ADDR_END: ;设置复制结束地址& p$ e- `( A* O; G: p
LDA ADDR_END
+ _+ A* {) I; P& p STA ADDR_FROM_END ;设置复制结束地址低位; q3 _. V% N2 ^8 C
LDA ADDR_END+1
; l2 ^& o' J f7 ?8 g1 _ STA ADDR_FROM_END+1 ;设置复制结束地址高位
0 V7 p0 v. P: r4 j
0 x! N) H A$ k) K( CSET_DATA_COPY_START: ;设置目的起始地址6 c& e) k1 o1 B
LDA ADDR_TO
' }; G/ x# p; `- E$ c' G/ m* N0 Q STA ADDR_DATA_TO ;设置目的起始地址低位1 M. e3 O: R$ c
LDA ADDR_TO+1
# V) R, M/ H- l, Y6 Q STA ADDR_DATA_TO+1 ;设置目的起始地址高位
# f2 G! f7 ^1 q0 J : I+ {9 {1 N- o8 u( G
OVER_COPY_CMP: ;复制完成比较. t8 o+ F! V7 `) v8 \* d- A
LDA FLAG_OVER
9 L5 X) Y8 K' J' C CMP #$FE ;复制完成标志比较+ I/ P: R' Y% v. q8 b
BEQ DATA_COPY_EXACT9 b! f o: E" r i8 p* _
6 x2 t5 T) E/ P3 ^
INI_XY_COUNT: ;计数器初始化
T+ Q7 `6 U0 B# ` LDX #$00! H: o5 U, W3 k0 w5 C8 K
LDY #$00
9 T; q* Q$ Z, S" K # C1 ?7 _8 f4 z, X, g
COPY_OVER_CMP: ;地址比较
* Y) V A' @0 z0 }4 y! z3 m& a LDA ADDR_FROM_START! b, l! p8 h0 S4 \& n# i
CMP ADDR_FROM_END
6 J' b: \( F8 _. D& E" ~ BNE COPY_START
" l/ R# f8 n E LDA ADDR_FROM_START+1
. @2 I- F l; `: v CMP ADDR_FROM_END+1. s. ]& ?* A) F- E5 J$ u. L/ ]
BEQ COPY_OVER5 O4 X( M7 u; ^( Z/ j
& y( N! W* V% N! _% h+ v, ^
COPY_START: ;数据复制开始/ F5 R6 T6 S8 ^3 ?8 Y) [1 k- f
LDA (ADDR_FROM_START),Y ;读取源地址+ b% `: |: H# W; J& ~
STA (ADDR_DATA_TO),Y ;写入目的地址5 T. q6 C' z$ y2 N
INC ADDR_FROM_START ;源地址低位递增
1 x& e O# |! v* R2 v3 _; v9 n2 {+ W INC ADDR_DATA_TO ;目的地址低位递增
6 Z; M2 G9 {* j& ` BNE COPY_JMP2 ^$ K/ }4 ]0 S, E& Z: h
INC ADDR_FROM_START+1 ;源地址高位递增
0 E3 n1 q( y% N, C" v7 N; i8 K" N INC ADDR_DATA_TO+1 ;目的地址高位递增
$ a& ]$ c. n# d, A2 H8 L+ n# H
c4 L6 T N. ~; v" u7 V# J U" ^COPY_JMP:
) }) ?9 N$ [1 @" Z+ `* R JMP COPY_OVER_CMP
" ~2 `; `" t$ N* W: o2 }* K t
- t" A4 o* k* m$ Y, ZCOPY_OVER: ;复制完成. w6 A- L7 Y |
LDA #$FE* p1 s& g7 a( e$ C) ?- M2 n: H
STA FLAG_OVER ;写入完成标志- {- m5 V# A+ m* c
FINAL_BYTE: p+ y* K7 k, k* S e7 M, c* m
LDA (ADDR_FROM_START),Y ;读取最后一个字节1 B! }2 {% f8 {. p# o P
STA (ADDR_DATA_TO),Y ;写入最后一个字节& B8 c2 _/ |8 c
4 L j- `% _6 s" i+ `DATA_COPY_EXACT: ;恢复数据
' B7 k. ^; A7 h% }2 O% w LDA INT_ADDR
" M1 Q N6 S4 c2 S8 C9 Y) _) [7 ~ STA $2000 ;恢复中断- H1 {! ?. Z! ?) j
PLA' m9 e( C$ Z1 w$ `" b2 X3 S6 X
STA ADDR_FROM_END+15 q2 I3 G- ~% B4 ^0 P7 Q0 W5 A$ Z
PLA
9 w. b% L: ?* x* y STA ADDR_FROM_END8 e X6 U$ T7 r+ c
PLA: ]: G4 K# @: D* d# u
STA ADDR_FROM_START+1
$ M5 I5 c) x+ O" ~ PLA
9 M5 W6 g5 S8 [; Y STA ADDR_FROM_START' `1 D! h. i E4 L
PLA- |1 f# N- B2 P6 r# ~" q7 i
STA ADDR_DATA_TO+1
3 N. B& G, k, F1 b9 O. q7 Z* ~& M PLA
, S; p- Q( p) o1 H- c5 @ STA ADDR_DATA_TO! x* Y0 t* ~* m4 u3 x$ C2 b
PLA
1 ~- @* _" c2 |4 _% X TAY
- v0 E9 n; I- j$ G PLA+ z9 V z: N' m @! G
TAX
. e& q6 l9 L. |5 v& H' r* H- x% U/ c' \ PLA. C# i( _6 S1 b
PLP
D! L$ W) M# s/ |6 ^; {
5 v* {1 y, m- n7 N+ m) e * E h' M/ C& b
" F- B, b) b2 U8 L. ZDATA_COPY_RETURN:
$ r( F; R5 { d% S3 p RTS" i7 k: Y& K. ~/ Z
7 a; K0 |# K# X) H) k" ^
.ORG $C056 ;精灵指令覆盖! j: B( C) Z1 l' V9 T& k2 H
JSR $FFB5
5 f' s( E7 l) b0 v* J - o2 c8 ~" J9 _: n6 F7 s, l
.ORG $FFB5 ;! I' {# ^0 v2 g( z. u
PHA1 ~5 y! @3 }, h) G
TXA
! N5 E( d8 o. ?9 Q6 f, @( u PHA
( q, D6 q3 H h! v. A TYA% n. E' g- E0 Z& F W
PHA/ u3 ?! d* L7 V) C
LDA $71FF ;比较7000-71FE数据是否完成复制
8 Y. ~! L1 M" u: L' R7 a) {2 p CMP #$FE7 k$ D% L+ x0 J) e+ Q# _
BNE ADDR_FFCA5 P- {( x6 T" G- A& {3 P
PLA
2 h! ~6 A9 @. m1 F& N TAY
6 a9 K! C6 j7 i) U PLA! w" T) o1 h6 I1 V" C) B, o E- K
TAX. h. q. ~8 |. R/ }
PLA, z) U& ^0 s0 t/ s
JSR $7000 ;跳转到自写程序! T: e- v: P& q$ ?6 q; }8 X) c
RTS
5 k2 o4 L8 I0 vADDR_FFCA:) X7 C, R: p5 P1 T) E0 R& q
PLA/ x Q( Q( A8 p* m, o+ ~/ R
TAY
, n* G6 b7 V9 R& k6 T* m; m0 P PLA
; d% }& Q" e+ K1 M. y TAX
0 v7 k+ u, n/ i C- R6 _% v; ? PLA3 X. T" i6 F4 y) J! n# ~7 E
RTS# x3 ^, s7 @+ @+ X; o+ j
! h( r' s$ t J- q5 V; ~! L2 Q" ^% ^8 }; v
# d# M; x* g/ J k& E$ S! Q
.ORG $C264 ;自定义的MAPPER2切页程序0 D8 U+ G. H/ ]8 f& C7 U7 z
PHA
& |* k" R# ?. k TXA
( `0 J, w: @, i! Q$ ` PHA
B# [9 `+ j: D+ ] LDA $0066
% p: V. Z& h& p" ` x BNE ADDRC280
' i7 |- D. `1 w LDA #$07 Z+ f/ L8 Q8 j, ^, G4 a
LDX #$03
8 t* K5 x* N, T, j" }: e JSR $CD9B ;自带的切bank方法2 @; |) L7 ]5 s/ r! W' h& K
PLA
% h1 g7 o' L9 K" l5 J TAX
8 ^) G- s0 Y X PLA
# ~/ u. q- t1 o9 @ JSR $80001 P) ]7 m! g$ R5 n& D
LDA #$06
. q) y0 L' D0 c) I8 R/ M* c LDX #$03
: T, r! x2 ^* l c% v. U JSR $CD9B ;切回原该切得bank(可以不用)5 J6 Q+ R, q) S3 y j: e/ X
RTS* g7 z& q; {$ |& {
ADDRC280:
' k: g& y5 q8 L! N2 [ PLA
& k- L3 m; I8 e4 q TAX
: m0 `% {4 ?. g: ^' D0 M& f PLA
, X3 @% z) l& P) ^ RTS$ g- i K1 I+ p, g) b) ^
K; F/ f* j! w3 G" c# T. U+ ] ' d- r w6 C. O6 Z( l, n2 f/ V
;[FC][最终任务PPU][END]
+ z1 z; ~/ y# E& \' { .ORG $C056 ;跳转到PPU重写程序
0 {& T6 U1 n3 H- F. E' P JSR $7000. z$ U5 G% ]4 e" F2 ~. _1 t
+ K2 \$ U( C' {2 F0 a& S2 o .ORG $CEBF) q2 D6 l1 }+ U5 M6 u( m
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
+ _7 C# |/ V! g + V; d1 q2 j7 `. L( z: U2 W) W7 K8 h
.ORG $E460" e) b* r% ~, m7 D8 t f
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
( Y3 P6 p4 j" e$ B/ | 9 z) _* y @* s9 u
.ORG $71F0* }1 F% c: B0 j1 u" K8 f! N
STAGE_DATA_WRITE:3 u; a; g3 ?/ s
LDA $6010/ H9 m. e) P% V( c
STA $1E ;关卡写入/ O5 w5 h/ k3 \! k' ^ @0 f0 t
LDA #$001 V2 x# Z% y5 p
RTS
7 Y! B: J: M- w, ? .ORG $71C0+ ^+ c9 r* t7 u
BULLET_DATA_WRITE: ;副武器数据写入1 o4 |6 V2 k1 d, F; N: v
CPX #$0E
3 t+ z1 u+ H7 l$ h ?6 w4 R0 n BCS P2_BUL
+ j; B. p& ?' F( UP1_BUL:, M. \. A$ B+ D& K" [$ R4 X
LDA $6004 ~4 Y" k/ p( J' v
JSR $D7D0 ;P1副武器数据写入
. O; S( r _+ a' w- E( k5 t }. o RTS% Z- g- ?7 V4 \5 i2 ?/ s! _
P2_BUL:
# q, ~1 t% e6 g) A( t LDA $6005
, R; h5 b, z _( [- g# h/ g1 a% t JSR $D7D0 ;P2副武器数据写入$ H+ i7 X# z: }% A8 L9 K/ Q
RTS# J8 M u2 Z( y$ Q) a1 J
4 j, V$ e4 Y, V& U6 v4 o g& \ S. t: n" i
.ORG $7000$ @% j/ E+ }4 N- h* f
2 q7 W8 I$ U8 a! C) I' W1 d$ P
STY $4014 ;补上覆盖的精灵写入指令. Y- S. ?4 P! }' `. X
PHA* w E; F! j, y( L
TXA y. B4 Q) o( u: j3 B: n5 E0 {* Z
PHA
g, x1 ?3 {7 U) A* B4 O TYA) Q" [, |3 L3 U5 C
PHA- t* K- v$ N. C) W
LDA $0C7 w+ k( h! ~5 C0 B- _8 G
CMP #$01 ;比较是否为标题画面! E9 X5 H) U [+ B- [
BEQ PPU_STAGE1 K6 {* f; L& P# C; I2 N2 S
PLA
& Y; C7 P/ m( D! S4 Z) J9 k# b TAY2 n- ?% k4 L+ l% l7 f9 ^
PLA
) T+ _% l& o3 I* Q% ` TAX
{. b e" ]3 q8 S2 Z PLA1 L f7 T, c/ f* }" U5 m
RTS
$ V3 d! X, d, o6 H. CPPU_STAGE: ;STAGE显示程序
" D# ]2 u: s P. U, N+ C; p* F LDA PPU_ADDR_DATA9 I. s9 `3 _2 z& O3 T+ w7 X
STA $2006
) C3 A8 W' t, ^8 W: Q LDA PPU_ADDR_DATA+1
0 [6 V4 t) g1 M" I0 k. K5 ? STA $2006 ;坐标设置( Y ~3 N) F4 l' V$ [
LDX #$00
' V' r5 K$ n) B0 ZPPU_STAGE_WROTE: ;写入STAGE字模
' h+ V/ r! x; P, S LDA STAGE_DATA,X- M: g8 s8 _& m3 B
STA $2007$ m7 B5 I( A1 h) D$ u; M
INX* a L+ u( W/ d# V$ Y
CPX #$06
* g* u# b: t" F+ O% b BCC PPU_STAGE_WROTE+ Z- s: {* c& |! L# A$ _
LDA $6010
' Z' a! m0 i# o* |1 r CMP #$FF ;关卡数据初始化条件判断# m0 M$ \% K9 q5 I7 I/ O2 P3 ~
BNE KEY_B0 ^% Y" N6 s' {: `0 b3 I( z5 S
LDA #$00
' {+ q/ a7 c/ ~2 o. C' |! X% p STA $6010 ;关卡数据初始化
9 `1 a$ r5 @* ]# Z/ {5 ZKEY_B: ;关卡减少' v' H' H/ l6 a& J! i* B( q
LDA $041 M/ H) Q7 s% ^ ?! `7 ]
AND #$42 ;按键B或左减关& ~, R+ g8 g& v* M0 K9 c
BEQ KEY_A, R; T) S8 Z+ ^2 L0 O) S2 k2 b
LDA $60108 `/ A3 O. U8 z! ]/ |/ G
CMP #$00 ;关卡比较
7 G; K; T% a& ?# Z1 R BEQ KEY_A
" K" `, z4 u& \ DEC $6010 ;减关
- T2 V1 g/ i8 c5 \KEY_A: ;关卡增加
2 O" E1 @ \& ]+ a. D9 A- \3 l LDA $04: D3 {, C1 U% v! }! ]9 P
AND #$81 ;按键A或右加关
9 h! i5 x* |+ k1 K BEQ PPU_NUM_WRITE
! ] t1 X- z4 s0 P8 j" Q; \5 N4 V LDA $6010' W1 p. Y p+ z2 M4 l
CMP #$04 ;关卡比较& i1 F0 Q5 D1 L; E# a( R- a
BEQ PPU_NUM_WRITE
# L( G9 S7 T3 n0 W( f INC $6010 ;加关: l- N" \3 b# w! H l0 t
PPU_NUM_WRITE:
* Q4 y3 N* w+ d7 @$ g3 @ LDA $6010
3 e5 s0 T/ M. F; |( k8 a8 V v2 ? TAX# o( [2 B p/ f
LDA STAGE_NUM,X ;写入数字5 S) I: [5 W U5 J. j# z
STA $2007
: Q; ?+ C! e1 S* F; i O/ oPPU_RTS:
3 Y3 e: r; X7 i5 X. J PLA; d. Z( q2 D! ^% T r. K
TAY
) w9 p/ Z+ d) \7 n: F PLA; ]1 d$ V X5 s: F/ }6 h
TAX
2 B& k0 ?* V2 X/ m( V PLA3 e1 O: v0 H2 x# J; t( s. X
RTS
/ p1 H9 Z P1 w( N' }+ v9 D 2 _& o# ^. p' \: F0 N& J' e! \
& o) z- @- N3 |, sSTAGE_DATA: ;关卡文字S,T,A,G,E,字模数据; m8 t; v6 q" J2 j/ V. r
.BYTE $EC,$ED,$DA,$E0,$DE,00/ j+ s ~3 v% C0 [' G3 N& ?- Q
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据
/ n6 I; d& e3 B* [- { .BYTE $D1,$D2,$D3,$D4,$D5
0 _6 O. {. @# e$ J1 P8 M
i, s# S7 x/ S1 a8 B/ X5 W6 a4 x7 j# MPPU_ADDR_DATA:" u2 r% Y0 }! S* O4 N: `
.BYTE $23,$0C
" p+ e2 q1 `. a3 H$ J1 M$ L 5 p1 M: c: `( I+ v. E
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|