|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 3 _6 t. f1 z- ?5 p: `/ D5 ~8 G
( [' V6 l) d6 q8 C! U1 Z9 c
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
3 o* i4 [) M9 M& h$ @ Z然而,今天想到一个思路.
# \* t5 R% |0 `. L0 j$ {) m8 J1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.; Z6 n5 j( m1 y8 x3 r; [! c7 s
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE, [ M/ }" B) n) A
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
9 @: }/ z2 s8 t4 f" Y( d& q
8 m- H; }: y4 n- J2 L$ V W* c( w: H8 ?+ {) h& s4 C
;[FC][最终任务KEY][END]2 _& P# O1 b- j6 P
button = $04 ;单次按键
, M& k n& J2 f+ B/ p5 D0 \flag = $6000 ;功能开关标志
1 P/ ?4 R6 y$ a/ Bpause = $000E ;暂停地址
/ P- a' ~# Y& K; I
' e- z# I' v; z! V3 q: d .ORG $8000
4 e% p- V" n. G& ?/ t' f LDY #$08 ;自带的按键程序
6 w: r' p! [% r+ Z, ^' B. F- yADDR8002:. b$ V) { Z4 y8 ?; b& P ~; u
LDA $4016,X
! U) j: a4 S7 Z' n1 F0 e; U8 b/ k/ [ LSR5 x2 q' n( X0 C( [! p
ROL $0021# t6 R) b+ Q! o% Z" T7 {( B
LSR' B( L, N" o: b% J: d- a
ROL $0029/ ]' p3 a! j1 a5 s6 S( |# K
DEY7 R3 ^( x5 Q6 |. B1 x, ]
BNE $80025 k2 X. e5 J, }) E
LDA $0021
- P) F C! i. z: n( _4 l- l ORA $0029
" s* R- g4 o4 `* w; Z9 W STA $0021
' u7 h+ K, b! R( c0 E0 I" h LDA $00206 U# M: b) v: s" X- F; P+ _
AND $0021
6 E, `* q3 f. D3 q7 A STA $0020: C1 @7 ?6 z8 {8 e% {$ B' U. s7 q
LDA $06,X4 g2 k1 \+ A; \1 D! U* ~& Q" n
EOR $0020* x7 ^5 I- w& t/ h; h+ v& u& x& S
AND $0020
+ Y$ F& @4 \, j8 w7 W6 | STA $04,X
/ S2 j$ Z" w r3 z+ t1 g/ W LDA $0020
) k2 T& N& V w* R v/ y- k0 { STA $06,X2 o+ D Q8 ~9 `
JSR KEY_OPERATE3 \! P5 O7 \; |0 D# s/ V
JSR Function ;功能调用
7 ^( ~6 d$ ^ Y. D5 f5 t JSR Weapon ;武器切换调用2 M! s/ s1 i6 d
JSR Power ;威力调用
9 v& F$ R4 A6 o* \% o# h$ P' [# { JSR BULLET_NUM ;子弹数目
5 n, Y* H$ N c7 w4 s, q: Z2 L JSR BULLET ;副武器类型
1 z+ z' I, D2 Z* ^ RTS
& @0 [/ y* B4 ?# }
* b2 F1 p, }' q4 @' _5 K0 |* J! ^ 7 E Q6 R& P1 X9 P1 l6 ]
% C+ g: K2 o ^; e- [ .ORG $80504 W, M1 A' S" q; o5 s
Function: ;功能5 u9 L# Q7 @8 W' l8 I
WUDI: ;无敌
5 y4 o$ Q' }$ z/ ~% ~ LDA $6000,X
5 M5 B& W; D D b AND #$08 ;开关判断: X6 y- S' w# U5 s
BEQ LIFE5 j& C& j3 C( B
LDA #$05
" h* q6 b! S6 }4 P* Y STA $05DC,X ;无敌锁定3 j' B# B2 E. I G
LIFE: ;生命
5 ?) G3 J' @# u% |: D LDA $6000,X
9 `4 T4 p3 ~( G+ ^3 [( h7 _ AND #$04 ;开关判断
* F h* k1 P8 V( M3 P BEQ FUNRTS
$ U4 T( i8 c* F* x! C+ x6 U0 e LDA #$05
$ x) @$ B, _) M. }9 Z9 q STA $1C,X ;生命赋值
7 V% ]" s+ F( D( NFUNRTS:
# o9 I% O: \. E# u2 k5 F) W$ Y RTS
5 w% e0 I& P; \
# D5 C8 h* o y) L' |1 _- SWeapon: ;武器切换
9 N9 I2 w# p& ?. m" k LDA pause ;暂停状态判断
2 d, H- n9 V* n' k BNE WEARTS
}; }# W, h& f, {4 D/ } LDA $04,X5 w! O, _6 H7 n* p& C% F
CMP #$20 ;选择键判断
0 g7 s- @) ?3 h2 k" u" t4 F BNE WEARTS
9 v5 V+ @- r* w" O0 i LDA $12,X7 Q3 ]. a# f. T, f/ K1 v4 {5 R/ `. O
CMP #$03 ;武器值判断
: k# X" N4 {3 W9 ^ ` BCC WEAINC* s6 R* I2 v" p c8 l. X+ l5 J) C( h' Y
LDA #$FF
* o" t3 v8 r. d, \) | STA $12,X ;武器重置
) c4 L- b/ @! `1 g: IWEAINC:
0 r g8 a3 H3 |: C+ S4 ]7 R+ {$ t& W INC $12,X ;武器增加
& X7 \% ?, S; p0 {) m 1 W4 {$ \3 r+ j. K6 w* Q' l; f
WEARTS:
+ V1 F9 k5 M% ]0 |, l/ O RTS
% q6 t& m' B: Y/ A1 o- y( M2 |
3 e/ m4 d" J0 [+ {: p3 R( O6 ?Power: ;威力
- ~/ ]) j9 F8 T7 I+ F& ^ LDA pause ;暂停状态判断: m# u9 Z9 P; Z* [
BEQ SPERTS* a6 N# i& A. Z# L9 t
BUT_LEFT:) d4 |9 y: x8 v" P# h/ k) b
LDA $04,X! t) i; r8 ?5 z/ O$ A1 G5 t2 i, J6 y
CMP #$02 ;左按键判断, G! ~9 g- ~) a1 F- b ~
BNE BUT_RIGHT
% H; k; T0 O. ], a4 p5 |7 o) F" V LDA $88,X, c1 `- x& |' ~) l$ [% a
CMP #$00 ;威力判断6 G# [5 N" b$ R$ J. b
BEQ SPERTS+ k( v, P$ Q5 T h
SPEDEC* g4 z! B/ e, d) b( g D# x4 _
LDA $88,X ;读取武器值
7 i( k1 w2 B7 { SEC
# s8 Y V3 P( E4 {7 E0 j% K SBC #$08; U; e* L3 x! R( w5 `. \. p
STA $88,X ;威力减小
6 k/ C2 ?- G8 s. ?BUT_RIGHT:
% \: [2 E/ {2 ~ LDA $04,X
5 b+ T: S, G7 C) T2 q) G5 f- O8 ~ CMP #$01 ;右按键判断. c: ^& Z( N6 e
BNE SPERTS" D5 M5 o$ b5 \" T* @
LDA $88,X
$ A, J3 V; Q2 a3 v& ? CMP #$10 ;威力判断+ D! `1 \# w" T1 g
BEQ SPERTS$ n r4 W8 ^8 z! d& b* j3 |' K9 t: G/ x0 q
SPEINC:
$ e; e; x" D6 A# ?9 w. _ LDA $88,X ;读取武器值- S; n! D$ |/ h. T
CLC
6 z1 Z7 u/ I6 p9 `" C- k6 Y ADC #$08
& p! e9 F: _1 [9 z STA $88,X ;威力增大4 |8 c$ @1 h6 r+ h
, D4 ?: B& @ c5 m# _SPERTS:
/ }. t8 H8 a$ S, P1 v RTS
) P3 j0 x4 D& m; o8 u! p$ I& T( J$ H4 C
BULLET_NUM: ;子弹数目) t8 a A" w) r1 h$ F$ W O
LDA pause ;暂停状态判断
0 p `, t, E4 _/ o BEQ BULRTS S! a5 {5 m5 N& K
CPX #$00 ;主机玩家判断& v: h0 c O; F" E1 U g9 s3 D4 B- c
BNE BULRTS# @. U$ N* B: r' P+ H3 h: c2 I
LDA $04,X ;主机玩家判断( x4 M; x. j& V) a. M6 H+ }
AND #$80 ;按键A比较
) P3 J' P! r# E" E0 Q( F BEQ BULRTS
6 E W v( g% w LDA $87 ;状态判断
$ s: W3 R: M( H5 J8 y BEQ BUL_2
* S5 H( M; Y# S' ]' f: s, RBUL_1:: D# p; R, H% T" P0 \+ U
LDA #$001 z/ W& A' z; K" X
STA $87 ;1发子弹+ R0 g+ F& B) }* \8 B3 |
BEQ BULRTS
5 `; v- X/ V; d& x6 ]BUL_2: v& j# D5 Y: S# c
LDA #$012 U# U$ F5 w/ c8 E& e0 ~
STA $87 ;2发子弹; P. A9 e7 E% n3 J7 Z
2 b; w2 B, K! l; [) r$ Z! PBULRTS:: q9 P% {8 a: d7 n) D3 [
RTS
/ }4 ~7 B! r' J: n' E# j9 ?! P ( p/ |, C/ C4 N/ k9 k8 f( q8 h0 \- a
, N! m6 z$ x1 q G" ?4 m3 f! JBULLET:
) f9 @2 ^; [" `) d LDA pause ;判断暂停状态+ p- W& J; D; M' L# H
BEQ BULLETRTS) U% p2 x% @6 D4 q# f4 d5 P( ]
LDA $04,X- C: f9 V7 N* E# z* S' |
CMP #$40 ;按键B比较9 _4 ?" k3 c' `: f1 c, C3 o. p6 Q
BNE BULLETRTS, m' d7 u0 V# R5 C
LDA $6002,X ;读取副武器
2 P4 M# u* z8 V, |: C CMP #$03
" M3 A" X0 d1 c BCC BULLETADD$ H+ @ P( N; {- t3 _
LDA #$FF
" t( v {! g6 W STA $6002,X8 w. N1 P1 t! f# [& G
BULLETADD:3 \- E% ? G N& U; ^9 b
INC $6002,X5 | I. P' y: q% w1 h s) ^
" v0 t, R2 Y( q; n A- ^
BULLETRTS: X7 \, |1 z, E+ ]) z
LDA $6002,X3 j0 c" c$ }% k. R. ?; H6 F
TAY
/ z) }: U5 S: a6 X( k LDA BULLET_DATA,Y
: s( y( Y* \2 k5 U/ n4 ^ STA $6004,X ;写入副武器数据4 w0 H8 D% u6 B+ X& ^! i
RTS0 N& l0 Y% Z1 U/ r9 l& S
2 k+ o4 `6 |9 ^) K+ _' Q2 x
* p% U% H6 f- F* ]8 d, R+ o; yBULLET_DATA:
( \6 L, {" E; u1 ]7 N3 d .BYTE $06,$02,$03,$04
, n1 c* H; N5 l, |0 G' P + l( \8 Y2 e3 h3 q! d9 \! E
2 M+ p! b/ h6 j7 o 2 ^% _1 K& B3 X* V0 C4 @
KEY_OPERATE: ;按键开关操作
- ?: J9 A2 Y7 Cdata_protect: ;数据保护
1 y& m H9 N$ \/ y8 \ PHA" C/ e5 p" t5 V, S+ B. U
TXA/ Z' M5 H/ L/ D
PHA
. G* L; i% t/ _ TYA
9 @, X5 F; N1 u PHA! M/ u3 |# x! J* W D
& W% f3 D3 x% E4 d
FLAG_INI: ;开关标志初始化
' B+ T6 X7 E0 W& J* U
) ?$ M7 O5 H( [ LDA $600F) M. L n# s" r2 x* V* [# K
CMP #$01
. S' C5 X' D* y( K2 O# Q1 s BEQ pause_cmp. K' A/ q2 ?, S9 c4 C
LDA #$00
7 @; U% h. \6 h8 y, ` STA $6000
5 v) @! ^/ t4 Q8 ^* `) i- @$ P STA $6001
1 u/ p0 `# ~+ L0 [ STA $6002
* C$ _8 w. E& H STA $6003
o7 f# U4 L6 l4 D2 V4 U) ?% I L STA $60042 j7 D0 B ~ _8 ?8 i3 c
STA $6005% t( W/ D1 r4 X2 @# h* I" m
LDA #$01
+ ~5 a# z5 I) }& h: ]0 y( ]: s3 B: `: | STA $600F
5 Z9 s1 N% t, x% B" j* G ) L" @ J- | V5 Y; _7 U- h* M
pause_cmp: ;判断暂停状态
; n' X4 @8 l3 G8 g- f8 C: t6 } LDA pause
- [, ~4 e% ^# [& B, p$ C CMP #$01 ;判断暂停状态" R% l( l" a! ^; e( s
BEQ button_press
0 u% |# H: Y b' j, @! s PLA
& Z6 F9 q; c5 |" S: r' ~4 o8 H# O TAY
' I) n( D: ~7 o6 S PLA' I6 D; S7 i, u0 m7 y
TAX
2 n; ]) p/ I* ^: B- G1 E PLA
6 M' `, _. E4 Q% @$ X4 l RTS S3 ]; d2 `0 k. U2 M7 Z) P) i
8 S7 n( K4 |' G2 Lbutton_press: ;按压操作) c* m% ^# ^4 J) |
ini_Y:% t5 ~ f" E2 V( ^
LDY #$00
; ?, a3 A1 W3 Tbutton_cmp:
. H: i. r* H( k; a) f- f5 x% x& Q LDA button,X" E( R4 W9 m4 Z" W# ~# R
CMP ora_data,Y: [. ?! U4 @4 x0 h! s/ m) i
BNE count_Y_cmp( P. M( V5 P J3 I1 p l- G2 k
flag_cmp:; _( c' A0 r% B3 j/ ]" h& _
LDA flag,X ?. s+ _6 j; s9 b2 D6 O8 J
AND ora_data,Y
: ~, \0 G! }) D" x4 M+ W+ G BNE flag_and1 O( V; W' }6 v/ g1 C* K$ _/ i
flag_ora:0 P+ `; o- z& v
LDA flag,X% O. Y+ B: k3 h% l; R3 E% p# G7 v
ORA ora_data,Y
1 y& D* N$ x: f a/ }0 C STA flag,X
: x0 z }. L4 k6 \0 ]* u- F8 E BNE count_Y_cmp. J$ P# n# H0 G. ?' o
flag_and:
& _1 y- J/ a( B. y8 V8 H LDA flag,X
! ]( Y3 z% E- r% A AND and_data,Y& O% M3 c" R7 l( _3 ^
STA flag,X/ V0 K. u( Z1 v
count_Y_cmp:
, n8 S6 {7 e/ R, ] INY/ n5 O/ n% Z! H9 |& |* Y* _
CPY #$08
( m! c% n4 k4 H; p7 \8 g) z2 z: { BCC button_cmp8 @! b/ B3 r8 I9 C
' l2 n" J2 n: s+ c* D7 x
data_extract: ;数据恢复0 {6 i; O# q0 W1 @8 N
PLA: Z5 N. L9 d0 N6 }
TAY
/ q8 s9 W+ ?$ @* |8 u PLA; D ~: M1 ]0 w% v# W
TAX
/ w; K$ m1 O z# i% T3 z PLA( G* t/ n) n( f* a7 _+ L) ~
) D4 d6 j8 w5 X% @; @
return:/ R: m% m( P2 g/ E+ I- M& q0 Z
RTS
" z& o7 {. l# [$ J" {) y8 i : y) m0 E+ v$ N g% S+ `- u% H
ora_data: ;按键相或数据6 w0 M: J/ |7 o7 h. B' w
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
S5 R4 ?$ ]4 U5 @6 Mand_data: ;按键相与数据2 X0 A8 e, R- a1 ~" M% M+ U7 H
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
4 z% @9 ]; O2 b. P/ [ * g* T9 p; h% z/ v* ]1 D4 p
5 {/ M0 d* O; I& F, f& M2 P
$ X$ U( p4 j: e& O& d v2 }
;FC数据搬移程序 BY FlameCyclone% K5 h9 P, ~0 P0 N& w
.ORG $8200
% \7 [6 t6 B5 B$ D# z& ]: i7 ^ JMP DATA_COPY_PROTECT2 F( ~' ]2 Y0 ]. \/ |
5 i1 j3 K' I7 |! |$ FADDR_DATA_TO = $40 ;目的地址
5 f# o* L7 [: v7 o" YADDR_FROM_START = $42 ;源开始地址
6 w- S# U C' k8 lADDR_FROM_END = $44 ;源结束地址
6 H! R3 j0 r' Z! p: i* e+ k: G+ C' {7 m: G+ x/ w
ADDR_TO: ;目的地址
4 @/ p% Z b4 Z5 d, }3 T: I .BYTE $00,$709 ~' i) e: c3 q8 l& C. e- _8 f$ v
ADDR_BEGIN: ;源开始地址! F! @6 ]. d7 \; D3 s5 r8 |
.BYTE $00,$83
E( K3 s. }7 \* ~5 x1 v3 r6 NADDR_END: ;源结束地址
; O% |, ]* q- ?7 ]1 |% F .BYTE $FE,$84: H" O2 M/ {; y
: E2 }1 l9 D+ ^6 j {, M2 qINT_ADDR = $08 ;中断地址+ T( o8 R$ V0 }1 L
FLAG_OVER = $71FF ;完成标志9 o9 R7 P% h1 [ N4 l1 `+ T
- j5 }$ G3 \( g% h
# ~* \& y$ I8 ?DATA_COPY_PROTECT: ;保护数据
1 M; y% @6 J9 Z! f0 c. q: t3 M PHP
4 ~' }0 |; K: z7 a% N/ D) }+ [! D PHA- B( I/ r4 b) ]) |' ~" P6 i
TXA+ n ]9 n* Z0 p O$ ` w# W9 M
PHA" \ N8 o+ U: z, c% a( _
TYA: N0 j' L' T) u8 |5 e1 h6 p! J
PHA; y& g K6 `; o9 L0 S2 v' }
LDA ADDR_DATA_TO8 |/ B% ~4 m" Q+ ]
PHA4 R6 |# h9 x: C o, v7 p
LDA ADDR_DATA_TO+1
4 u/ H. D+ L0 } PHA
6 V; f. S% m' O: ]* R LDA ADDR_FROM_START
4 ~8 B2 J3 | {' F& l G8 O( }" P PHA* H' _' j' N) s0 n5 H
LDA ADDR_FROM_START+1
' T6 g( s2 p' l: r/ {) `5 r& y PHA# d" J* W% }: |% ] [
LDA ADDR_FROM_END
: x9 V% H6 q. {( g6 F0 x PHA
% ]" s ?% C9 @1 P LDA ADDR_FROM_END+1
/ S: g1 c- E% `7 ~6 w PHA
* `9 c, d9 \, d I' h2 H0 N2 x4 U
^; s' j! C8 ~8 COFF_INT: ;屏蔽中断# ~ F) t4 d6 q0 J' d7 U- v- M
LDA INT_ADDR Z! U$ U% A2 V& U) \+ i8 t1 ?$ l u
AND #$7F. ~: @1 u3 ]7 _* Y* j! _8 C
STA $2000 ;屏蔽中断
/ R2 p6 a( _! ]' ]. g
0 m1 Z* k; a3 s: [* S
- b! f6 U6 [) d- ?SET_DATA_ADDR_START: ;设置复制起始地址
! @$ h6 _ i" [/ g LDA ADDR_BEGIN
/ C; @. [4 }4 ^9 a; P, G! r' Y STA ADDR_FROM_START ;设置复制起始地址低位4 m$ t- d+ N" u9 |
LDA ADDR_BEGIN+14 ~0 U( Z1 y8 @2 a( r+ ^3 E* ]
STA ADDR_FROM_START+1 ;设置复制起始地址高位5 @$ |, D( y) [- }
$ R& Z1 y/ \1 j( W2 S1 f# Y1 T+ b
SET_DATA_ADDR_END: ;设置复制结束地址) b" N# q, x% f
LDA ADDR_END
# [5 Z' L, Y4 r2 ?5 l* Y STA ADDR_FROM_END ;设置复制结束地址低位 U3 M' x8 b7 J6 q# _$ P
LDA ADDR_END+1' E; T6 h9 ^% \! {1 n
STA ADDR_FROM_END+1 ;设置复制结束地址高位# [5 E6 G( N3 o1 H4 j
& u, @; k9 Q+ S) d, g, s1 ^
SET_DATA_COPY_START: ;设置目的起始地址
3 t/ A5 q5 }- g0 h/ M: I) f3 F LDA ADDR_TO
6 d, W. a% d' _' P/ L% }& ] STA ADDR_DATA_TO ;设置目的起始地址低位
" c' R: `! D n4 ?7 F o% l1 p! a LDA ADDR_TO+19 v- I1 s- K2 O4 I
STA ADDR_DATA_TO+1 ;设置目的起始地址高位
" X& S; g0 ]% [( |
+ |4 v7 `: R, uOVER_COPY_CMP: ;复制完成比较
1 E, S @2 z( f! s5 } Z* @ LDA FLAG_OVER
: v' k9 M v; c9 c( A s CMP #$FE ;复制完成标志比较
- L! `( Z0 s& p6 e6 f2 c8 { BEQ DATA_COPY_EXACT1 c5 ~- |: C4 V2 ?! k6 C& g
2 v) g8 e6 y# W" q2 ?7 Z! }5 c' UINI_XY_COUNT: ;计数器初始化, H- ]; S0 p6 @$ J G3 j' l' a
LDX #$007 s) [ ~* D! u% Y' P k
LDY #$005 {" a6 d, m* G% ~- w. |( C. m
' ]/ w. N p" N: _5 f" rCOPY_OVER_CMP: ;地址比较
1 B7 r: o- E. a5 c LDA ADDR_FROM_START. E# F1 p, s0 f+ _1 c/ v8 [# E
CMP ADDR_FROM_END
" L& `8 D/ S$ T4 f/ Y BNE COPY_START! I @( x$ @( }) m: {
LDA ADDR_FROM_START+1
$ d* T$ a7 j( e( D4 x) N, H. y3 w CMP ADDR_FROM_END+1
3 _2 \) E" W3 Y BEQ COPY_OVER! S% s! {4 K4 \& J
, ?; Q8 N0 \# O( t9 XCOPY_START: ;数据复制开始+ N. c4 S) u& ~# B3 A4 I/ J1 O
LDA (ADDR_FROM_START),Y ;读取源地址0 V# ^" V" c1 d3 r6 g
STA (ADDR_DATA_TO),Y ;写入目的地址. v7 B$ @0 \- Q' _+ w4 L+ n0 P) Z
INC ADDR_FROM_START ;源地址低位递增, V1 \9 M+ c4 y1 ~
INC ADDR_DATA_TO ;目的地址低位递增' p4 x( r1 o8 d$ M# q% J
BNE COPY_JMP
- r$ {. V& [: {0 g h INC ADDR_FROM_START+1 ;源地址高位递增: @/ U2 `% b9 F: b. n
INC ADDR_DATA_TO+1 ;目的地址高位递增
- ?4 s% Z' n* l2 q. u6 I& ~ / R; J5 u8 b) s4 q( o0 |& _5 t
COPY_JMP:
g& x' f8 E }% ]2 g JMP COPY_OVER_CMP
% ]7 _- w7 h6 K/ U
; _/ Z1 ~1 F N# q; xCOPY_OVER: ;复制完成
& `) e# h7 C9 r3 R, r; d LDA #$FE1 c* A8 D, O% f& K! K' a) _
STA FLAG_OVER ;写入完成标志
_/ G- m4 _+ Z4 E4 o' @FINAL_BYTE:
3 q1 `: c+ {' n# L LDA (ADDR_FROM_START),Y ;读取最后一个字节+ _. Q/ U* B8 O
STA (ADDR_DATA_TO),Y ;写入最后一个字节
, w# i. e" k; O3 d' H9 N# }
% ~) h% y! N2 _0 gDATA_COPY_EXACT: ;恢复数据
! L, `- `6 ], G& N3 ] LDA INT_ADDR
4 W; {! a8 D, z0 U STA $2000 ;恢复中断
. q) o' }( L# z3 c% m3 _$ U PLA q7 a4 a9 o) l3 Y& v1 m) m2 R
STA ADDR_FROM_END+17 I3 _! {1 X& R. n# |6 ~7 w+ P
PLA
6 s) |; c/ n% V% H( U8 B& D; S& J STA ADDR_FROM_END
+ i5 r4 E& v5 @: h3 t& G8 ]' w( X PLA. U6 }9 n8 |# ^$ {
STA ADDR_FROM_START+16 T: V7 N8 W7 y# I
PLA( V' `# w1 ^. b7 o
STA ADDR_FROM_START
+ ^/ k' d$ a/ W PLA z! a1 B( [% @! z4 A
STA ADDR_DATA_TO+19 t: }( ^& r! F, f
PLA; c* D- U" `# C& X1 {% z' j$ P
STA ADDR_DATA_TO
1 d2 X! B$ I! b j6 t( Z PLA
& B7 D7 h0 ~/ I. j* ]3 \# t6 Z( O5 \ TAY, S u! I7 j6 ]2 s( I
PLA6 h# A: f$ e, t- P
TAX
) H; d$ |3 _6 F) h0 H PLA# \6 I$ x7 v: K9 \3 w0 B0 p
PLP
1 I6 s8 x. i1 v$ v W; J, T! N3 b4 I
3 d. X8 g& K0 c$ b# X 0 f) W0 J4 J/ ?( B; z1 R" Q8 ]* |
5 u0 H, {$ B6 I* X! w) GDATA_COPY_RETURN:
8 I- d) u: ?* h+ [. A- B RTS
+ q+ l2 j9 P( I+ V7 z& k# G& r 8 T6 y' s y1 l% O) M
.ORG $C056 ;精灵指令覆盖
: P0 V4 F7 R- s' n9 @, Q JSR $FFB5
0 Y, P8 a0 N+ |$ B3 B* R
- l5 v7 D" {3 ^- s0 G .ORG $FFB5 ; k" _3 Y# t* ^1 _1 A; ]
PHA, Q" s) p- R0 J, |
TXA
, L8 I. ], p" w: T5 X0 z PHA
) k% g) I- ?( }& C+ J* y! B TYA
! Q1 @& i0 E$ B% ~' m PHA
* g4 |1 v3 _. R LDA $71FF ;比较7000-71FE数据是否完成复制8 v, o& _! I% |4 e, k. t
CMP #$FE5 K) [3 P, E' X/ t5 ~+ I& H
BNE ADDR_FFCA2 U/ k g1 E. N* Y+ A
PLA) b1 r8 k9 p" b" ?. w* A3 r, J
TAY
9 s9 O6 m6 a9 |8 }- e PLA
2 a8 |9 e+ }6 d4 z b3 L/ u+ | TAX/ s8 E* ]( ?" J+ Y! o i/ [
PLA; S% e* W' u2 x; [9 ~% R
JSR $7000 ;跳转到自写程序
# ?, l/ F5 x& d8 E$ D7 G' l! L9 ]2 P RTS1 P) {8 H* ~+ j. S2 M9 h+ D
ADDR_FFCA:( m) d0 W+ `# k6 F% {& F8 s; V
PLA/ |( a. T, a% `
TAY5 ]# R9 m) B5 w; l" s3 k# a
PLA
% L& H4 ]2 m) @( V& v/ Y9 o1 F9 z2 E TAX7 H, H) {$ S$ H( @# H, u$ k# D
PLA
/ I2 F- T. \# o RTS9 d5 }& o q# {" c E* Y( c
" \; Y; k' N" o
5 r3 a- @0 K2 l% h8 L
; N4 X! G8 X0 f( W; T) _ .ORG $C264 ;自定义的MAPPER2切页程序
4 V ` M7 }% i1 c: s PHA
) A. B" e6 J) q' o1 r+ L' G e2 P TXA; u1 L% c& R9 `
PHA# e! A9 j6 a1 t0 [% h
LDA $0066
9 h6 ]- W/ T- K# \1 D; D" v% r# O BNE ADDRC280
( v- {: M5 R. f" z! G LDA #$07
* Z: f: q. c. o2 v% z) c7 B+ G LDX #$03+ Z$ H3 ^) A" B( m: x' `
JSR $CD9B ;自带的切bank方法
3 r" y& L, |( B* { PLA( n$ P. I. t) m* h4 y
TAX
3 S, D8 \" _' `0 g. f PLA
- w$ }0 V/ P0 }" k; r: q0 W8 { JSR $8000
9 J9 }; L* a* }; ^0 q$ y% q' c7 S LDA #$061 G. ~: s) \# n. G' k
LDX #$03
: O8 V( B" i ?1 ]# D JSR $CD9B ;切回原该切得bank(可以不用)9 b k$ o- \% y0 W' d" ]7 F |1 H
RTS- w( c( ~, `9 }+ ~2 [
ADDRC280:9 p4 l3 g, B4 L3 [
PLA
: N! @( @; |9 P4 S TAX
! L" f7 g# L' p6 N; F' { PLA
8 ^+ s: x% z4 T$ O1 _& ]5 x5 L& }% ~5 Q0 [ RTS
9 q( [+ w3 _# a) Y0 P- w/ R
3 |8 n+ U. S1 u1 b j( M# |+ d2 d
;[FC][最终任务PPU][END]
7 h( k( G- y" |0 i" y8 M N .ORG $C056 ;跳转到PPU重写程序: |. [- G8 C8 ]$ R' p& A
JSR $7000
" k. L' f' J; X& O* j2 m! I% q( J2 n+ L7 s
.ORG $CEBF
4 f) n" ~0 a+ K1 t) c+ G6 o& n JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
( V% y0 N8 p' F1 ? D8 P' X" A9 @- i; [& x9 ]2 J) W
.ORG $E460, U( C& K7 O# W' l) L: E5 q
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入
+ m' v2 _3 g6 e! O. M5 a3 J ' n+ V2 \6 Z# x- T6 n9 X( i% x
.ORG $71F02 e/ A% e+ s: o; Q" z4 z; n7 N1 c3 {
STAGE_DATA_WRITE:
% S8 ]) A/ V' m, Y1 ^ LDA $6010
5 b" `" l3 c5 t: i2 i6 {/ L STA $1E ;关卡写入' T5 o$ W' p7 r' D' O
LDA #$005 e1 u G4 d, Z8 U! B* k, g
RTS/ F6 I2 m8 Q( E. t1 g4 Y* X
.ORG $71C0+ u, z5 o# s* P' V6 y9 \, i
BULLET_DATA_WRITE: ;副武器数据写入7 U9 W3 {" _5 x0 i" w" w5 Z& w' A
CPX #$0E/ T3 H( D; ]& ^9 F1 N
BCS P2_BUL
1 A* h2 o! }5 h2 i6 Y7 BP1_BUL:! v U+ F% M$ {5 @
LDA $6004- l- R2 t" k7 |+ X4 e' H1 X
JSR $D7D0 ;P1副武器数据写入
/ M5 Z9 |/ \9 G" J. W/ W4 ?3 W. e RTS& b# C* O3 n. X. W
P2_BUL:
/ X& o9 J. W& } LDA $6005
* t/ r7 g! e" Y/ m. G8 X JSR $D7D0 ;P2副武器数据写入
! l7 q9 i V l1 Q. F2 l) U RTS
0 ~6 |1 N1 w* j8 B/ O# j9 v2 F( Y: m# _0 t
. v2 F D# b4 r) l# ^6 N
.ORG $7000
& a2 H m! V1 i& [# r7 Q 0 ?( O! B; N5 y
STY $4014 ;补上覆盖的精灵写入指令8 M& \. c# `8 ?
PHA
" `! S" o ]2 o7 r+ [* e TXA7 T( \, r. o# v4 r0 ~: s
PHA; M7 {6 l! B5 ?; v' g5 L; r/ r
TYA" C9 H1 b, G- A" ~5 u: g1 c. C9 m
PHA" c7 P- o; Y4 o2 K
LDA $0C! |+ n) n; r0 @8 ^" t
CMP #$01 ;比较是否为标题画面
5 @$ v& h7 U' X. H9 K BEQ PPU_STAGE( D% ~$ g# i2 _ i" M7 ^& }
PLA
% k; s# P* b* L3 O& N* l* h. T TAY
, m* Z6 s4 t( p PLA
% f! o! i- S2 Z L TAX
. e0 u! J! _7 h$ d5 f! C PLA
8 E5 w6 `% u4 ?+ \' ?4 H+ r: @* @; n, { RTS
1 u/ M9 b4 p3 g- ?: P5 j3 u9 XPPU_STAGE: ;STAGE显示程序
: c. m: e3 s/ P7 f: { LDA PPU_ADDR_DATA4 [0 U3 V' o% K. {5 v1 w- @
STA $2006
3 X% A, R( z) J: x t1 a LDA PPU_ADDR_DATA+1# b! H, J" b( P9 G5 j& }
STA $2006 ;坐标设置. s. ^3 `" S0 p7 G
LDX #$00
- d/ ?& U: B$ L' s* ?+ I; v* xPPU_STAGE_WROTE: ;写入STAGE字模
9 y( w2 w6 C8 i/ a2 X LDA STAGE_DATA,X
) q4 |; d( ?, {5 \" J STA $2007& B0 ^! t8 I$ F; d
INX
( P3 ?8 b6 N, g7 e' p6 ] CPX #$06
) {) }% m2 k v' M) h BCC PPU_STAGE_WROTE2 R( z+ Y* Z% }( ]
LDA $60102 B- [6 G& V) c- @
CMP #$FF ;关卡数据初始化条件判断2 i8 v1 ^' q. N+ C: R R; y
BNE KEY_B
+ }/ a+ N: i+ m7 _3 e6 J LDA #$00, M+ E5 V# @1 p6 P9 `& D
STA $6010 ;关卡数据初始化
; ?0 p6 ]( k% B1 s) o. jKEY_B: ;关卡减少
* P9 L+ _9 c; I: U LDA $04 T) u i0 ?. C, D" \1 d
AND #$42 ;按键B或左减关9 x: ]! E+ f! o: b/ q' I
BEQ KEY_A
7 _+ ^; J7 i' E- u0 N0 N$ t LDA $6010+ n2 q" {+ ^) {4 q
CMP #$00 ;关卡比较. {; K' L1 g) U
BEQ KEY_A
+ N/ T0 n1 }8 a9 s/ f DEC $6010 ;减关- I7 ^! a+ t0 {* T5 i- `
KEY_A: ;关卡增加8 T" v6 X8 b9 J: r1 D4 @6 K2 _- W* n
LDA $04
& P" a J' R) U |/ o$ t AND #$81 ;按键A或右加关3 o- F& G) A4 I9 r7 c
BEQ PPU_NUM_WRITE2 @& ]- u) y' Z+ }) ]* ]
LDA $6010+ B: Z4 t9 \' t' G2 L6 M
CMP #$04 ;关卡比较% T% T; [8 z$ H) F) H! ^6 x
BEQ PPU_NUM_WRITE
7 k* E7 ?% C# A9 p5 w1 j INC $6010 ;加关' W& S3 N# O) x3 }
PPU_NUM_WRITE:5 @* N+ G0 }+ w
LDA $6010
( {6 |$ m1 P R' j- O- Y O5 ]1 f8 P) z; z TAX
0 \9 H9 m8 G, o' D8 Z) p LDA STAGE_NUM,X ;写入数字; i" q* N7 M' e3 @
STA $2007
1 l1 @" M3 U& k* `- u5 j5 J9 pPPU_RTS:
- p: l- |: {, I' w9 ?; M! a PLA$ g+ Y1 N3 r4 l" o% g, f7 ]! ^
TAY
* W* U# k' O) X3 u. N PLA
. d" m) @5 a3 N% G+ l! t# s TAX( e/ }: B6 o& G2 K- Y. y& o
PLA% I9 ?7 B& O$ ], m; K
RTS
0 ^; V- O4 m" o# o+ ?/ c + ?$ A+ `& }! m* J5 n% [, |
9 K% d3 Z, C7 l/ XSTAGE_DATA: ;关卡文字S,T,A,G,E,字模数据9 _) N8 C5 N3 \+ n% `+ \3 h; @
.BYTE $EC,$ED,$DA,$E0,$DE,00
9 V) Z% n3 P5 a9 PSTAGE_NUM: ;关卡数字1,2,3,4,5字模数据+ Y, w8 A3 Q( z% z
.BYTE $D1,$D2,$D3,$D4,$D5/ z% Z/ x9 R) j' U
; ^$ ?# y- v+ [PPU_ADDR_DATA:
0 A3 B! j7 K2 L8 X# B: q) l .BYTE $23,$0C! i6 G. t. [5 P8 `% X
$ Y/ R/ b3 R- ]0 d. P5 q/ i, B
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|