|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
0 W3 k& U( |) ~% s% c0 f7 Z5 P) K1 s% N! ]" w( |
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.; q7 Z; h7 r+ P7 m( U$ C+ I
然而,今天想到一个思路.
! N& c& c6 S! k- K" ?+ b1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
x' M. }: r! h8 G, Y2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
* f$ Z& n- P% }& d' w3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).8 Z8 D9 ]1 B+ S
" C, {5 u8 ?$ @% c
3 G7 l0 ~- I- r4 i% r7 D/ Q;[FC][最终任务KEY][END]; ~3 [% j a6 f3 J) y/ n
button = $04 ;单次按键$ P E4 n+ T$ E8 G e; b3 [
flag = $6000 ;功能开关标志, {4 f0 _' Y# Q2 W) ~1 S
pause = $000E ;暂停地址
, m! P) t/ h3 X' M/ i) {! }9 p" q. }
.ORG $8000
+ S2 n8 g) j& j: \+ f m LDY #$08 ;自带的按键程序( K. S; D& \7 T! h9 m0 {: p
ADDR8002:
5 g5 G0 Q+ h/ h$ Z5 }1 w' f LDA $4016,X9 w3 J: y0 t8 V! ?, ]7 V N k
LSR
2 V% v" a9 E, ~$ @ ROL $0021' C+ s$ V8 t! q$ W! L8 F/ ]
LSR
: I) h) u1 V$ E ROL $0029/ x* |! y) U8 O o' G
DEY3 l: M) v- g8 f! `: ]! M9 W
BNE $8002
: p! w- c/ t' t8 P# {, C2 G* V9 M7 o LDA $0021. T1 v% P& a6 t
ORA $00296 [$ e2 {1 n) q5 T/ e
STA $00211 I' w% |- E: w' \* o
LDA $0020
+ {; G! Z: V: V AND $0021
* B* }+ T6 w/ t! r! |9 t. {- m- Z STA $0020
6 E( S0 J. G0 b1 u6 Y" I LDA $06,X
; r1 D3 v) g* M EOR $0020
8 |5 q' c" W6 X0 y AND $0020
4 J% K( P# [" l: K STA $04,X
. {$ k) g- x* U9 N H7 J& C LDA $0020
; f4 X: Q# U! _, f( X5 s4 m7 j STA $06,X8 F" b/ N5 P+ V
JSR KEY_OPERATE5 w- q# [/ S) _, c* @% H
JSR Function ;功能调用! T) J2 Z" d; D1 M' O
JSR Weapon ;武器切换调用
5 h* W1 r, P/ \$ `# B7 E7 Z JSR Power ;威力调用
! \7 ^" E8 x2 ]* R2 I& }7 q9 u' P JSR BULLET_NUM ;子弹数目5 c) P1 a& m' u6 i- n
JSR BULLET ;副武器类型
/ L% E& z1 l7 k( c. ?3 L$ t: j" _ RTS
- E i/ `/ j- J1 A5 m0 n% }
' y1 q& c+ [: s' T& T3 a! B0 v h$ t ( n8 B: ~( T: l6 q; Y# q
. {- ?+ ?6 o# S
.ORG $8050
' C9 J, l& K$ B! O T0 q8 C4 K! tFunction: ;功能! x3 D+ g- @4 {; G1 q: v N
WUDI: ;无敌
9 Q/ s( Y5 g: C+ |7 E7 {/ I LDA $6000,X6 Q& Z+ R( a* c/ R! q( P {
AND #$08 ;开关判断
5 _7 v& P% D! u9 r2 W8 V BEQ LIFE, l1 j- a2 V* w$ v( j' p U
LDA #$05
5 ]$ s! P8 k$ @ STA $05DC,X ;无敌锁定
) R3 q$ C3 v/ D4 Q% E4 ZLIFE: ;生命
, t2 H2 Y g" f& T7 v LDA $6000,X
& |/ D& s5 L, ]. a$ ]4 u AND #$04 ;开关判断( h8 U/ X) d. h9 K# x E, B
BEQ FUNRTS5 i8 O, {# @2 S2 P, P
LDA #$05
1 s# |# J/ A5 `) W STA $1C,X ;生命赋值
! T! T Y- \. j9 I! t, ]FUNRTS:: v" ~1 R4 [6 s! X4 j- l0 V
RTS% Z2 E5 e8 i9 v
' A p( u! K& n3 k" Z( ~
Weapon: ;武器切换. j2 y( h q5 {1 b
LDA pause ;暂停状态判断
$ ?3 Y: c }8 c9 h BNE WEARTS
* d0 d3 [$ _2 A& I0 W" N5 k LDA $04,X3 P* U s0 {% f- F9 J5 Q3 c4 B8 [
CMP #$20 ;选择键判断4 t% T% c+ G# ^+ X3 e
BNE WEARTS
( m6 b) y- k% x% _& q" q* R' P LDA $12,X# i- n0 ? C. ^
CMP #$03 ;武器值判断
2 o+ R1 i7 k. R/ X, ]) b" U BCC WEAINC
; \" ?5 \" H7 q6 D! N5 S LDA #$FF- q" E+ ]) c S& x0 b
STA $12,X ;武器重置
2 Z+ @; N2 H/ sWEAINC:+ v4 P8 E1 a" d2 a* o+ M' m
INC $12,X ;武器增加
7 x3 E4 x8 ^. z0 @/ R7 u
* b d, W& C1 CWEARTS:. p4 }9 Y' _9 K* V5 E) m
RTS4 E8 c1 ?5 E, C* |
* m6 z% S; b+ q4 y. t8 F* i
Power: ;威力
3 f2 A2 v8 t$ w0 O( ]( \( \' d LDA pause ;暂停状态判断
! d# ]0 Y4 F( ?6 b: ?1 i1 d# ~ BEQ SPERTS2 T" z: @7 C% v) f# F
BUT_LEFT:, n' |. {) c0 M Y1 H/ m
LDA $04,X
' h$ I( T, ?" a |; ^+ k CMP #$02 ;左按键判断3 C$ x! c. M4 }; }) y! {2 q
BNE BUT_RIGHT
2 f) w/ Q" W/ O& G( M! ` g% r LDA $88,X
1 Z4 d [9 P) l( x2 ] CMP #$00 ;威力判断
4 Y; k( W; j! y0 r, I1 o BEQ SPERTS
/ k. ?" I7 Z- Z: M; M SSPEDEC
+ u/ E9 {8 A, e6 {' ?! I! _ LDA $88,X ;读取武器值
D) i \8 G( H/ ?( j k. \ SEC
9 l/ Y: i# i5 q: q6 z( V SBC #$08& l4 Y- _ y9 M) V: q- Q$ v- X
STA $88,X ;威力减小* i: X* J ]# n: w
BUT_RIGHT:( m9 M k& [1 k6 @
LDA $04,X
2 d: I. X9 s) W* H# R CMP #$01 ;右按键判断& o" a- _1 D! w2 q4 p% u& m
BNE SPERTS7 s% T1 }* U: P- y5 D
LDA $88,X* ~$ B$ z0 h+ g B6 l; Z
CMP #$10 ;威力判断
' h, Y; L+ E9 Y- N+ F, Z2 e BEQ SPERTS3 i2 S+ {4 [6 m7 p/ }& H8 G6 x
SPEINC:% i- @. l6 h: w" E3 k6 q
LDA $88,X ;读取武器值
: X/ a4 p: m6 f6 Y9 r) o+ V CLC+ p" i; R2 h9 K- ^( ?9 j2 x. ^
ADC #$08' [ F$ `+ \- v4 T8 J0 ^5 }
STA $88,X ;威力增大
+ W7 t$ Y3 @4 m+ d: x* A
9 R5 \+ m) P; H) N) }SPERTS:
3 k7 Z2 k4 W1 j8 w RTS
6 n" u& {# P4 s5 ` ]+ r' J* q* z* s( q8 a( v
BULLET_NUM: ;子弹数目! E! B% B" W0 F& i" @' Y
LDA pause ;暂停状态判断
0 `6 Y- L! R. F1 ~ BEQ BULRTS4 ?# ]: f* N. D; ^8 |
CPX #$00 ;主机玩家判断' @' w- G1 t( T! c
BNE BULRTS/ x1 a0 H; i7 C( e$ X9 e& I- v! t
LDA $04,X ;主机玩家判断
$ l6 E0 i4 g$ I AND #$80 ;按键A比较
# t; C) ^. h w" Y+ U& v BEQ BULRTS8 Y$ J1 A: T3 p7 E" R9 k* C
LDA $87 ;状态判断0 A. S3 W% v+ L4 }* }+ Y8 T
BEQ BUL_2: B G, x# h. X) u8 Z3 k8 r
BUL_1:
- Q& g8 C9 W9 B1 X5 K LDA #$00, K" K6 N$ H; s6 Q
STA $87 ;1发子弹/ a% }( v; h3 J8 q$ h& W a
BEQ BULRTS: X0 g( o! Z4 d5 \" J3 w- D6 T
BUL_2:
, U6 w: J4 Y7 E3 k/ t+ d+ @ LDA #$018 X! p' E% {" A$ W- P9 L
STA $87 ;2发子弹
" l2 @+ S8 H' G& o4 h s. @ $ [* l) N7 W4 Y$ o
BULRTS:
3 `& D+ v# ]) r4 G! ]! ? RTS8 d8 q4 x9 q" E; s
# Z( V; V/ F* h' y# `8 D6 @
; b1 ~: b5 y$ z; NBULLET:
; I9 c2 P, x9 Q& L8 E" ]( t LDA pause ;判断暂停状态" Q- P' w. Q I, h* J( ?) U# z
BEQ BULLETRTS
- O% I7 y8 O c: N+ e( a9 q LDA $04,X
9 c7 k4 o) ]3 I! K' k CMP #$40 ;按键B比较1 b5 N" H+ g5 A
BNE BULLETRTS
& F6 i4 A8 z) Y5 G LDA $6002,X ;读取副武器 b$ P2 G% X, q0 B/ n3 P& R% u, w
CMP #$03- Q; y& ?8 F( v* p1 ~1 x# I5 M
BCC BULLETADD
. J9 R* C/ `5 Q" [0 ? LDA #$FF
6 r& J" V2 d2 c- P5 S& B STA $6002,X3 q( W+ c# u& `6 o r
BULLETADD:
% a% @/ H4 p; ^, n1 d- \ INC $6002,X, a: Y# j9 q7 t4 f2 d$ I* V/ ]6 J
$ Y5 J6 o' E% C3 d+ \/ hBULLETRTS:
% d1 j3 I+ I X- b2 c LDA $6002,X
1 O6 Q; n! E# T, h. j TAY
* G2 c& G& B- u- a& F+ n+ H LDA BULLET_DATA,Y
d( i9 `- w/ n" Z$ l# \6 R9 a* w STA $6004,X ;写入副武器数据
6 N3 W9 O8 L6 _( D z9 ]& H5 C RTS
+ m& I. I5 ~! R. @8 i
; q2 s# _9 m8 g: f7 Y$ q- u/ z ! p) q) ]% U _" J
BULLET_DATA:
9 w u+ ~5 o3 o+ Q; y& t .BYTE $06,$02,$03,$04
. H9 s2 T! C* Q
: k \. y$ p/ `) G: b 2 n5 b y4 P/ V% C- B* j! r/ L
: U |6 t8 p) u. l. |0 p
KEY_OPERATE: ;按键开关操作
, G3 G; d& [4 B; @! k* Y7 kdata_protect: ;数据保护
$ C K/ T+ N R U PHA
; r, Z/ z) Y0 |0 E: |3 Z8 q7 A w6 O TXA8 T; Z& q* z3 A( \) s! e* Q
PHA: ]# @0 j( r; {5 z j
TYA1 g( a6 P3 t7 e0 q3 B5 m" x# f
PHA
) a4 s& ]6 F: |/ @3 z
s& a. `/ ]/ N1 i- w1 |+ lFLAG_INI: ;开关标志初始化7 [. p( v7 {" k4 z c: X9 V
- l% Q# s4 p* ~* B4 D; l
LDA $600F
' K& `2 U4 [4 j0 w$ A CMP #$01! k8 M# s% a8 X6 Q5 t3 N
BEQ pause_cmp
6 t) V6 o! s, E5 A4 r LDA #$00
& o4 @, j# S3 _ H: b STA $60002 R/ d& K! R8 Y3 s8 g1 _7 `$ O2 }9 ]
STA $6001
! k: F8 k7 K: S9 T, Y2 ] STA $60020 D$ q, C" }% a% g( t! h
STA $60039 T7 ^0 S; h" X( e, ^2 L, {
STA $6004% q& u% t/ _( S: U |
STA $6005
: r+ F$ B9 P j" T3 ] LDA #$010 E3 t- T# ~3 R4 J. J. p( |+ R% j
STA $600F
, u0 X0 l$ I4 J8 a# _- s! ? Q3 C : d; u7 ~7 g4 l! \
pause_cmp: ;判断暂停状态
% z' \8 @( e/ \ LDA pause# v! `% l. P( S J
CMP #$01 ;判断暂停状态; _) w$ f1 {+ P" N1 C' F, i
BEQ button_press3 c/ I" X" a- X5 J7 p. V& A: m
PLA
5 F% a) b ]" _! W) { TAY1 Q( [# B; K5 L+ X$ m, q
PLA
, n/ ^/ E Z7 s+ o TAX
! C- Z: j# d: q PLA
6 Z+ B! V4 E* J' B RTS
1 R+ w. d" j- J; r2 B8 N2 R7 t& U: O: X
button_press: ;按压操作
5 T7 f! O) j' Y& q! T. V0 w% Aini_Y:4 j$ k" O) u2 Z7 d6 H
LDY #$008 H# T! \. b" q& ^8 D
button_cmp:
( N# d5 ~6 t/ m M; f9 v F4 @* x LDA button,X/ b/ }' r' P/ f1 }6 h$ k8 ^, u$ g
CMP ora_data,Y1 Y2 m* Z* y) y; K* D8 V
BNE count_Y_cmp
( a* F7 G1 @ m/ o, Yflag_cmp:: H3 Q* ?& `9 b/ @1 ]! _0 s
LDA flag,X; [: p6 `% E0 Q& g1 `8 X
AND ora_data,Y8 M; n1 I& b' L: ~3 }( ?1 ^) w
BNE flag_and0 X- c& z/ h' q9 p
flag_ora:
0 D9 y6 M8 l, j' ~- @+ J b LDA flag,X
8 s" z/ _5 U; v$ w% ^: D, ` ORA ora_data,Y
) t6 j* [$ q1 x; y& G! W STA flag,X
+ J3 } L3 x/ Z! G: W: g1 c BNE count_Y_cmp
3 Q( _" {0 e! \, m2 b3 e* N2 b- gflag_and:. [- _- d" ^/ |* a' u6 d& |
LDA flag,X. E& R$ M% g* P# H" \' C4 D) W
AND and_data,Y
' h$ ?* z5 n: r2 ` STA flag,X* x$ r% U e, i. e: ?
count_Y_cmp:
" L! z8 Z& O D" t INY
* \1 n4 G+ R8 p- m; A CPY #$08
2 C r. r8 ~* H( \/ a8 B BCC button_cmp
3 a) h/ |' \& [9 D+ T, u
8 `& k% w# i" B& }. \: {# ]5 ndata_extract: ;数据恢复
4 r" H* u% }0 b PLA
1 P, c. `8 J, J1 \ TAY1 {$ A1 u7 a9 q5 U) q3 G
PLA3 F* P1 s+ E4 G- V! Y" C) Y# M
TAX
$ s# W% p6 Z" @8 l s PLA
+ W, |/ e5 g1 P3 q
8 z( x! a7 W3 Xreturn:
' Q P" I; M0 w; z3 l, ] RTS5 b- e% N- b. q5 O7 z
/ e! F5 X, F- f
ora_data: ;按键相或数据
8 f" T' i2 c4 K .BYTE $08,$04,$02,$01,$80,$40,$20,$10
1 S% B3 |8 \: o& ~) e$ r1 A0 P7 band_data: ;按键相与数据% T$ q$ M% E0 [/ L' o8 x8 ^' }# Y
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF( A; d( `+ j0 t5 M) u0 J, X
* M: w/ C8 s6 v- x- j
7 }4 d6 W |. {3 w
9 h, K$ m& G+ q& A5 ?9 m
;FC数据搬移程序 BY FlameCyclone
: W* x0 P- e2 u- T .ORG $8200$ K [+ F5 V+ c% x( }; p2 Q
JMP DATA_COPY_PROTECT
1 |& f* u& q ~1 L% d3 M' u- u1 y
ADDR_DATA_TO = $40 ;目的地址
% C) j1 ^8 Y7 aADDR_FROM_START = $42 ;源开始地址" k; T) A2 C; M5 ~
ADDR_FROM_END = $44 ;源结束地址
`. Q4 |1 \' ^) I. Q6 W- k3 @6 M2 Y5 I! C% @
ADDR_TO: ;目的地址: x# b# Q( u4 H, D0 p
.BYTE $00,$706 w0 l* h, m$ A2 }3 ]) c
ADDR_BEGIN: ;源开始地址
- p+ c6 f, _6 i0 b. J0 y2 F .BYTE $00,$83
$ O* |7 c6 _6 k+ v. E% lADDR_END: ;源结束地址 g- B, D: _9 L* h8 ^0 V0 r* B
.BYTE $FE,$84
1 Y$ q/ n0 P+ R7 o4 I" `7 O& q; ^) o( |- g
INT_ADDR = $08 ;中断地址, q, w ^4 n, q1 s `: u- B3 s4 |
FLAG_OVER = $71FF ;完成标志7 {0 R/ f8 [; z4 @# x2 z2 j) H$ i/ r- u
3 m: t, J! }& s! N$ W
) |7 d/ `, _1 U, ], H# E2 a5 n0 S8 nDATA_COPY_PROTECT: ;保护数据
' g: y- B2 P. c- w! N W% G PHP0 T- T& N* s6 p7 t
PHA% d/ x% g; I& n! s# v8 }( ?2 U
TXA6 N' k, N' v4 {6 j0 s" x# X
PHA: C" l$ |) W$ t3 h
TYA; N# q' b7 g3 F- w3 x7 `. |
PHA Q8 c+ D: v) Y3 g4 m) e* J8 `5 E
LDA ADDR_DATA_TO
& x9 j1 C+ w( n0 l1 @ PHA0 w& ~: f0 Q t
LDA ADDR_DATA_TO+1
# J; p1 o) n9 C' L5 u9 | PHA) I t2 G' d, ?6 L$ n
LDA ADDR_FROM_START
1 R* r) H. c' f6 b4 |' Q PHA
; }! x! b. \9 L) {4 _8 [' c. D LDA ADDR_FROM_START+1+ C! A2 c( R( p5 L* _
PHA. ~: t3 F0 n. S) M
LDA ADDR_FROM_END/ F! o8 l6 q1 `. d6 E$ M( Y
PHA
. W/ e/ E8 ?; D; k" K4 i LDA ADDR_FROM_END+1
& o6 {" l; f- q4 V PHA. M# j, [, N- ]1 }
, b- v& U0 ^, }- M- kOFF_INT: ;屏蔽中断* C) A, f5 e% C2 [, O. @
LDA INT_ADDR6 a( Y" X0 Z0 t( `9 s6 S' d$ c' S
AND #$7F% T; q( \5 |0 \$ g& v2 e+ t6 i
STA $2000 ;屏蔽中断
3 _7 n% f9 a' x# x$ O# a0 F% r ^, M: ?* h( w/ B1 `, E
. F& y) }5 ~4 x
SET_DATA_ADDR_START: ;设置复制起始地址
, d y) E4 L& O ]+ k- ?5 @% x LDA ADDR_BEGIN* [. n+ k2 B, Y; |
STA ADDR_FROM_START ;设置复制起始地址低位" @) V" U# P( k8 g: p0 [
LDA ADDR_BEGIN+1
8 A& z* ] L# @; @ STA ADDR_FROM_START+1 ;设置复制起始地址高位% ^( h6 q1 g7 @: k
! O: x+ g; d' f' T1 M4 T8 ?
SET_DATA_ADDR_END: ;设置复制结束地址
x! I1 |0 j8 x+ \0 P1 H LDA ADDR_END
! {+ D" O# E* j) ` STA ADDR_FROM_END ;设置复制结束地址低位
$ Y) p! ^7 b5 l! c# b' b LDA ADDR_END+12 }$ {% g, H& d4 Y- C3 x* [, m* e
STA ADDR_FROM_END+1 ;设置复制结束地址高位
1 ~( N+ e. h3 p( l9 N# d: u
6 e) T6 @# A' S: }2 cSET_DATA_COPY_START: ;设置目的起始地址 T& T/ s6 Z! A4 \
LDA ADDR_TO$ t* \) V+ M0 C; k9 i. e. j `
STA ADDR_DATA_TO ;设置目的起始地址低位
% C% M; K9 ~, Z- M( K+ C% H' J# T LDA ADDR_TO+1
1 G7 _! v( y* T0 O4 W q; N STA ADDR_DATA_TO+1 ;设置目的起始地址高位+ S7 u7 r) _# U) D C" m8 J
7 \8 _* _5 N; w5 A$ f: D
OVER_COPY_CMP: ;复制完成比较7 }2 x1 t8 {" y& u u, A+ c1 s
LDA FLAG_OVER E) u( V9 `* e( ~ O
CMP #$FE ;复制完成标志比较
. M7 s$ {7 H5 F) G* a$ \0 g# A BEQ DATA_COPY_EXACT% v; I$ Z$ i D7 g' w1 R x
* v. E9 i) {% i- l T8 QINI_XY_COUNT: ;计数器初始化8 Z2 f% B2 n8 H6 w& }% o
LDX #$00
; ]! z) s7 a5 v1 ] LDY #$00
9 W! B; b1 }$ j& Y! x' g3 ]! [( o a- \2 E$ m" J' s2 D3 d
COPY_OVER_CMP: ;地址比较
" S1 \+ f. ^' O$ h2 [: |1 J LDA ADDR_FROM_START! M1 m# z0 O2 b2 Y/ _# F5 w
CMP ADDR_FROM_END1 N% h) a- F5 J! u0 B0 i
BNE COPY_START
+ e* k8 z8 {# P$ [- J LDA ADDR_FROM_START+1
- O* ~0 s' d5 C+ t- S# Y6 s" H CMP ADDR_FROM_END+1
& t7 i- e$ C& u$ T1 n2 x BEQ COPY_OVER
% ^) H! t! @6 b 1 M# q4 A6 r4 ^9 L9 q9 L, j
COPY_START: ;数据复制开始
- s5 S0 x. y( x! O' A- b( v LDA (ADDR_FROM_START),Y ;读取源地址2 a" i8 O) u" ^( S% T) r
STA (ADDR_DATA_TO),Y ;写入目的地址 e+ [+ a7 `; u! n0 B6 i' A
INC ADDR_FROM_START ;源地址低位递增
( I# u( {% @4 D INC ADDR_DATA_TO ;目的地址低位递增2 S S; K* n6 }; T& N7 J# V
BNE COPY_JMP" R6 x& s4 Z$ l: H
INC ADDR_FROM_START+1 ;源地址高位递增$ e0 \; Z* P. s* G: Q3 ?9 j j
INC ADDR_DATA_TO+1 ;目的地址高位递增
9 z: p. o* u3 X# }
% F/ y& a1 D- G% ?COPY_JMP:
9 J! C' E5 o E. N' m JMP COPY_OVER_CMP C! |* Y: c( N! |, _
/ }) @; Z* o+ _3 w! ?COPY_OVER: ;复制完成
8 d+ F" A3 P% F" N3 ^ LDA #$FE4 I: k0 k) W' Y8 `8 K( W
STA FLAG_OVER ;写入完成标志
) G- {0 r" E6 S+ s3 GFINAL_BYTE:
( I1 h7 G9 ~( N/ R) T LDA (ADDR_FROM_START),Y ;读取最后一个字节
5 N; |- s; m& m) _7 U+ U STA (ADDR_DATA_TO),Y ;写入最后一个字节
4 w0 S, I) |, G: K
5 ~% z/ v# g: X/ Q0 [+ \DATA_COPY_EXACT: ;恢复数据9 o" M$ R3 ~# n9 ]4 N
LDA INT_ADDR
" z# J/ I9 \) g" X h* H STA $2000 ;恢复中断
# O* x* m, H% ]: e5 ]- | PLA# E* Q7 P- S9 z- E
STA ADDR_FROM_END+19 d: w" s) j/ d/ W
PLA
5 f3 M( C+ f, B0 U1 K2 w- C' F- T* d STA ADDR_FROM_END
C& i9 g+ }& W$ V% H PLA
$ W; z, C' |3 m1 R7 H( b! q. e$ j9 | STA ADDR_FROM_START+1
- \. m" A$ Q& c% h8 [1 ^" X b$ D PLA" J4 o' a" g: @; Y+ S) J0 G
STA ADDR_FROM_START% L$ T7 O0 y2 x1 E3 g7 p
PLA/ f* T% ^" ^ T7 G
STA ADDR_DATA_TO+1
q, r1 z& i3 ~9 k/ }" w* m PLA
4 I3 U- g8 R$ {- J! P5 c; W( _ STA ADDR_DATA_TO1 V, D% E- ~0 u: m# w2 ^
PLA5 t L* L9 {) N3 ~* ]
TAY
/ I4 ]4 }7 Y" b/ D6 ^ PLA
$ O9 [, r7 W6 ~# d1 R' f TAX
) f3 ^5 L' a3 B& u) p; ]" T, F, W PLA
: N& @1 W+ [# B4 Z' r0 s4 O# z PLP
* {! g* F$ _' @- U$ r0 G l
! l" `% z" d5 b4 T# J; `2 c o 3 a" W! w) J5 h% F5 J; z
; h; p& M8 r: y. oDATA_COPY_RETURN:2 B3 Z2 H9 V, T9 E/ r4 u
RTS" ?( s$ u2 l4 ~ q
! [9 t! v) M& W: m
.ORG $C056 ;精灵指令覆盖, R) Y. _* s) E& O$ A
JSR $FFB5
! C7 _! i3 o0 E' u+ D. B' h 4 u: J4 X4 v: m2 E1 u
.ORG $FFB5 ;4 m% M% W* b9 [( |' B, V; y: l
PHA; c3 ~) F1 v7 M; U8 a; x
TXA
# }! x( S1 a$ h2 H& Z! X" a, { PHA' B; a1 I. l: y1 `0 t
TYA* i8 [: G2 b: K, g6 d& w
PHA5 A0 d. M7 `! F j
LDA $71FF ;比较7000-71FE数据是否完成复制 j& {; Q" t* B- h$ i
CMP #$FE
+ a$ H" ~$ O3 I BNE ADDR_FFCA% h; i2 f, e7 ?; y8 _
PLA$ o% \) d! k" c& e2 l$ G; o
TAY/ m4 B- j+ s( B
PLA
' G% r6 y; j/ h( I" b, b TAX h* s0 g! y, @0 T9 \$ `
PLA0 j! [* s/ t+ z- @
JSR $7000 ;跳转到自写程序
% w9 {% h+ L* M RTS! B, V( V: ~2 B7 U! U! d6 v+ ~
ADDR_FFCA:
4 t) u5 F' k. I PLA0 `1 ~0 x$ X# C4 u2 l
TAY
; Q( D3 m9 w1 e2 \6 ~, C9 L- p PLA
# @) w* k' Z4 ?5 S# F c/ V6 K" e TAX
( }" o4 S( k4 q) j3 E PLA
6 ^( [) z+ d2 A* S+ B! ~ RTS
' A! s1 [# g" s4 s; E- V2 w! ^+ l8 U* `* X$ ~1 M
- R- w# |. L" K2 Y* n: g
! p, [/ }7 [: J5 L1 P3 u% P
.ORG $C264 ;自定义的MAPPER2切页程序% y, d/ `. B! L# ~. l
PHA. W% @: ]8 o; _9 e
TXA& Z- D' g- X# J, _& d2 H, U
PHA9 u! @5 h. q2 I: T
LDA $0066/ g* j6 N4 _1 J d! Z& \# H) b
BNE ADDRC280* o4 v& e7 Y/ K% i; D( R1 `
LDA #$07& \" d5 R5 y0 ?* K- P3 j; L, I& H
LDX #$03
4 q) h# {3 N& Y# R$ _/ R JSR $CD9B ;自带的切bank方法
0 I l7 L/ @% @6 g- O" j& F PLA1 j6 g2 i- q' ^ ], d3 t7 k
TAX
- N- k# S# K( ^! l2 _( u4 p) W0 m8 } PLA
! u: `5 g( Z$ t: ]( o% {; v2 A JSR $80005 r e9 M7 }7 e: K9 T g
LDA #$06
4 X9 t7 r" S6 b# k' M LDX #$03+ h) f% i8 [) U# L4 G, [
JSR $CD9B ;切回原该切得bank(可以不用)
' P9 t# y7 m/ R; }9 U* q1 A) @3 t2 r, o RTS, a. O5 D& L& o& i; z9 T+ S
ADDRC280:* T8 |$ }" i9 \6 O
PLA
8 u; u& e) a' D5 V9 t0 `6 H* Q TAX9 n$ E1 p, l2 K; R: i9 @
PLA7 N6 ]9 f8 A& W$ W! J5 ~0 u6 \
RTS
$ v8 W/ B) H! B
* _. B; p' k) u( g , M) Z" {; R3 c
;[FC][最终任务PPU][END]; y5 f+ A$ a. \& a! R! q
.ORG $C056 ;跳转到PPU重写程序8 x# F* T& v1 b4 \
JSR $7000
6 W$ x( W3 d4 c1 n
/ A6 r/ i; n# v .ORG $CEBF
% B: E3 R0 ]/ i& ` JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
( \$ t+ ?( ]" W6 s- X3 b* \3 i 4 z) |( H$ y, M2 Q9 C
.ORG $E460* z+ x: @# U9 e) G9 C! Z+ I
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
& K$ n, U9 v& S+ K' P % O+ S7 n9 s u6 `; H% U
.ORG $71F0
" g. d6 R4 E; ^1 v0 MSTAGE_DATA_WRITE:
% E7 q# c8 h4 u8 q& a LDA $6010
& X+ S M0 L% V1 m STA $1E ;关卡写入; f+ X& Q: e/ E, h
LDA #$00: v- ?! M: c# n. \& @
RTS) g' o+ s! I+ j" G* ]$ |
.ORG $71C0
! A1 j1 S# @! ?% nBULLET_DATA_WRITE: ;副武器数据写入
6 M! o: A* b6 u CPX #$0E/ A, S* m. |5 t: k( g5 u' j. `
BCS P2_BUL
6 k8 p6 b2 C5 | t ?( w* o+ }1 zP1_BUL:
: j% J3 Y! r t+ [7 A% L LDA $6004
, c: V% Q# b% V: w JSR $D7D0 ;P1副武器数据写入
) Z) b7 Z* n7 c RTS. L Y& e) f/ W, O
P2_BUL:
- N4 P* V: C$ z# X. H LDA $6005
% Y9 w2 w: j& q) ~; S6 k( _ JSR $D7D0 ;P2副武器数据写入2 L6 v8 ?; B% L- [% G
RTS' v+ g0 t |! \
7 \! ^8 i% [( B2 o& |# y, a
C" y# q8 \8 H3 r; P9 ?
.ORG $70000 f8 b/ f, z$ t6 s4 L
9 y/ D9 d3 L) ?1 x. H
STY $4014 ;补上覆盖的精灵写入指令 W$ M. @5 }+ m' s6 ?+ ]& \
PHA
. o4 z& U1 f t0 m2 M4 p( i2 r TXA
( n7 {1 ]$ k0 e9 P- e k1 F: i PHA. u8 o' c; ?6 Z$ `9 `' x* Q
TYA
0 _* L# v, Q4 G$ [9 e PHA
1 P5 F6 C5 O3 F+ Y2 s. b LDA $0C
) n! N( `: F) F, v$ o9 \2 b' P CMP #$01 ;比较是否为标题画面
3 t4 a* L. U/ g6 y5 Z$ ^: ~ BEQ PPU_STAGE
* w6 u0 @3 l. G- f2 Y, L PLA
& P7 F u0 t$ ?+ q/ C TAY
3 s P h/ t3 r! I) h K4 f: B PLA
2 N" G9 e' v6 W3 W/ _# e TAX
/ Z9 j* i/ K. j5 B% O+ J# D: y PLA
`6 R) J1 T% J; R) T9 O- Y; Q RTS8 M6 J, u- T5 z
PPU_STAGE: ;STAGE显示程序) Z4 L- e: ]- }* L; F8 ~( E
LDA PPU_ADDR_DATA
% A, s; k! f( X# z Q( L STA $2006) x: ?& v% f9 @) P1 d
LDA PPU_ADDR_DATA+1
- g0 F; @$ c9 p7 t0 }+ e K STA $2006 ;坐标设置
; F) q- a9 w, Z$ _7 d LDX #$00
V: w% O! N2 i5 S# }$ RPPU_STAGE_WROTE: ;写入STAGE字模( H* O% p e7 P6 b% s/ W
LDA STAGE_DATA,X
$ {, K: N- O2 g7 a1 O: V STA $2007
/ T6 Q0 l/ O7 Y g6 |2 P% V INX
" C) f7 ]+ h2 o8 P+ ~6 r1 E CPX #$06
( b: f1 f/ {$ T BCC PPU_STAGE_WROTE" b6 e% t8 r5 F' |. |4 j1 I2 ?
LDA $6010
$ E p& i- T5 k; C) m2 L6 S CMP #$FF ;关卡数据初始化条件判断1 j' E' E+ R- ?& l$ L
BNE KEY_B
: r9 [2 R, {9 o/ V! R8 Z* ^+ U LDA #$00
2 W2 r: U; a! a7 I STA $6010 ;关卡数据初始化
! D% P5 V7 H4 M mKEY_B: ;关卡减少0 v7 Z$ n) r' T P. Z# Q" ]1 S: I' @# h
LDA $04* R6 y0 M' l) J
AND #$42 ;按键B或左减关
4 v) @( P8 a2 b. \% Z( _ BEQ KEY_A
$ g9 P& H( {% l Q6 q9 _+ j LDA $6010
1 B6 ]5 c" m" K/ o CMP #$00 ;关卡比较
( E6 z( @7 L3 ~* P/ s4 K7 V BEQ KEY_A) y, ^1 O, z8 i4 H& `/ a+ p) r
DEC $6010 ;减关4 Y5 p0 K9 B* U5 J
KEY_A: ;关卡增加% M7 T4 H# f( b
LDA $04
: O6 q" X4 I9 P; E AND #$81 ;按键A或右加关; `- \4 Q7 M: q' a
BEQ PPU_NUM_WRITE
( `5 R- ^4 l; `& m& [ LDA $60107 e8 g: `# @9 `; j5 g
CMP #$04 ;关卡比较
8 l; d. O8 y% ?1 k1 _0 Q BEQ PPU_NUM_WRITE c; Y( A# }" p P
INC $6010 ;加关' t8 \- x6 d% q! @) y" v8 h3 |
PPU_NUM_WRITE:
$ e5 }! I4 e" P# i, N% c8 f' \7 U LDA $6010
: e, \7 s: u E0 g p0 U" n% _) w5 _ TAX5 T9 T# e& X/ Q
LDA STAGE_NUM,X ;写入数字" Y/ v: D M* W
STA $2007! F [9 v5 b. x. |$ u5 ]' z; J
PPU_RTS:7 V. V8 {; P/ V) ]0 I. }$ n8 B' R$ @
PLA3 y+ m; K$ [( x8 S6 N: c0 _( `
TAY) p- e6 R0 i( L0 a3 ~# n
PLA
, t3 b" K) Z; N TAX( Y# v0 t+ c* g. A- L) t
PLA
# V+ m: `! c8 A/ W9 G- h RTS; h$ M7 l8 r) Z+ d& U
# N1 v$ z. @6 u4 l J* N! p! a
5 O1 a2 R( `2 _5 O7 ]6 ^STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
: X( \' }2 R) r0 S .BYTE $EC,$ED,$DA,$E0,$DE,00( r3 R0 Y2 A2 l
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据2 O0 p7 Q3 M. t; [2 y$ z F! {
.BYTE $D1,$D2,$D3,$D4,$D55 {, A" w# U, K& V* h: o
% @0 j) ?8 G1 T% YPPU_ADDR_DATA:
: |) Q0 o2 n5 Q) N! x .BYTE $23,$0C( h) L1 {$ D9 s
1 }, v% h) c) p9 M1 T; Y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|