|
|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 ( _8 j/ Z' T; X8 c. x, `
- G8 `7 H6 k: D; T- M! S$ |" s
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.
9 v+ ^; c; |" }$ l, ?9 N+ @5 p0 i5 [然而,今天想到一个思路.
- ` F9 ?4 _4 D3 X1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
* l2 ^! D8 G( H% E4 l5 [2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE
8 J! l4 }- A b, m6 g+ D! v H. A3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).6 _) M: V$ T$ y) t! Q
9 K3 [ u2 y9 P3 R- r
; w' g$ a- j$ e0 f% z* d2 e
;[FC][最终任务KEY][END]
3 ^- g, ?; y; x' F& A, Zbutton = $04 ;单次按键( @' l# J: }5 u3 P
flag = $6000 ;功能开关标志/ w# Y! \+ _* x' X, q/ c: e
pause = $000E ;暂停地址
! f0 o. F0 |( |+ j: _: m+ b$ l$ O( K# X9 h
.ORG $8000
3 o. o" @# [: m4 t& B& S LDY #$08 ;自带的按键程序& k/ x, F4 B* K* o9 Y5 E& W- y
ADDR8002:; j- r- S+ M S
LDA $4016,X
4 q$ n0 ?; {* q8 {+ n) _0 N3 Y) E* @ LSR
! T$ v3 |, {( n0 e; B7 a ROL $0021: V! i$ E; q N; ~7 ^# r& D
LSR, R. x9 f3 C" k
ROL $0029
- |$ T/ A0 a* j# x! T+ F4 z DEY! ?* L* @; a. b: |* L* b4 F
BNE $8002
2 {9 g" S6 y K, u+ i/ I LDA $0021
5 i/ {' i6 M8 b$ m0 K4 m! q) ]/ b ORA $0029
/ G- ^5 Q2 ], Z; I0 r' P" q STA $0021
8 T) D& [1 `- }( `$ ` I LDA $0020
" V, b1 q1 u7 s6 X: { AND $0021
) r) J( f2 M# s) y4 t! j: F STA $0020( ]3 Z5 L( _1 X
LDA $06,X
$ @) n- g: w) W5 J EOR $0020
/ i- E3 k9 [. U AND $0020
1 {8 N6 x" J6 s5 ^) V$ \ STA $04,X$ h( V) m+ ^. K
LDA $0020
! I" ]' y- ?4 j2 k, C% d, G STA $06,X- }. f" R2 p0 \8 o' Z
JSR KEY_OPERATE, z8 W+ ~/ a- o w
JSR Function ;功能调用( a6 G3 z# l. ^0 {$ D6 u8 r& Q! u6 W
JSR Weapon ;武器切换调用
3 u# T& F! A L' w JSR Power ;威力调用
$ `: T3 Y, Q9 O' w JSR BULLET_NUM ;子弹数目
7 c% {/ u4 i# M! i4 k9 _$ F JSR BULLET ;副武器类型
9 B% V9 T$ `0 r/ f* @7 h ? RTS! `' R# R0 c6 y( ~" z- e' V5 w: V
9 J4 I0 ]6 Z3 |$ T4 R9 M3 d- g 3 y; f4 \0 b+ p. s; f* n' E. v
1 C- S( {, E+ p .ORG $8050, Y; y* M3 }: p, ^- m" I7 c
Function: ;功能" |& w- O: Q! s% p+ q/ c
WUDI: ;无敌. M w+ w% B0 A) j7 y- [1 J! b
LDA $6000,X/ t9 _1 }2 U3 v
AND #$08 ;开关判断; i% B& e6 P% [3 _3 A( O8 b
BEQ LIFE
( x: G h M0 @. z8 |5 m LDA #$05
. B5 y$ N) P1 f' ]1 A STA $05DC,X ;无敌锁定
2 j9 S/ t7 X1 ]: S/ sLIFE: ;生命
+ T3 G2 I/ |. ?8 f. z LDA $6000,X
' \3 A+ I' E3 G4 v h AND #$04 ;开关判断( K. a0 f$ D9 f
BEQ FUNRTS
/ \+ |& `0 K3 K' b* S; L; v LDA #$05
+ P7 E* D' _; \" H' W STA $1C,X ;生命赋值
3 \$ ]5 ]/ M2 n- oFUNRTS:5 E( c6 V( u) H; u
RTS
@8 \' S1 y% F* n1 q * [* {7 P) c; P( d) u
Weapon: ;武器切换: E5 j) q; Z' X" T+ p* m) T+ R. f
LDA pause ;暂停状态判断
3 X/ M. J! X% n7 O% v1 d BNE WEARTS
$ }" w. `; s6 D$ |0 @( Z LDA $04,X
$ T- I9 t5 K1 x1 r5 L1 O9 ? CMP #$20 ;选择键判断6 R- d4 s" g' Y% [0 t0 Q
BNE WEARTS' J5 o& k; }) D7 t" p
LDA $12,X
/ B. i# H7 L% c CMP #$03 ;武器值判断2 @7 n3 W# o2 w# _* r
BCC WEAINC
" l* |( ~+ y0 _% e LDA #$FF( R c5 F- Z2 R/ a
STA $12,X ;武器重置6 r" r4 z1 q' Y# Q, E
WEAINC:8 T* y4 z! ?! n5 B6 c- ?
INC $12,X ;武器增加1 N( ]' c: k4 F3 R2 {3 o7 D3 w
' w: b& {" f9 h% p3 hWEARTS:8 w# z; J( N6 _0 I! z0 e. s5 T
RTS
( m% ]! i* K0 ^
4 y0 r2 G7 e# B; @9 Z UPower: ;威力
/ @: k0 W" I, c8 d8 K9 }/ S LDA pause ;暂停状态判断! ?& u' w* d! L
BEQ SPERTS
: v1 Q( b: T9 j! `, NBUT_LEFT:' R, P% p) j8 j. T) t, _
LDA $04,X
" {9 r) g8 g8 ]7 b8 Y8 D CMP #$02 ;左按键判断
% p* b' p3 E5 F7 y- o BNE BUT_RIGHT5 J) h @$ B4 U7 r: k/ J7 B
LDA $88,X
& `" E* ]- C; C* Y CMP #$00 ;威力判断; F# h5 \6 D1 {$ ~, z1 N. g9 D* H, w2 [5 A+ @
BEQ SPERTS" e3 Z, e% _" V( _
SPEDEC
( _& S8 G `7 a% I2 I' i LDA $88,X ;读取武器值/ r# b' T6 ~& \; K; V( f
SEC$ v1 f7 T( T) w( u
SBC #$08, n% p" N5 k/ d) Y+ ]: o
STA $88,X ;威力减小
) x ?( ]" _- H9 DBUT_RIGHT:: t" A0 i! x" [6 R( v s
LDA $04,X" v* g/ R' H- P/ j9 Y
CMP #$01 ;右按键判断
7 j2 M5 G; D6 E, L! k* X BNE SPERTS- `+ _ y9 x) |. z
LDA $88,X1 k7 T, p. n5 b4 U/ J
CMP #$10 ;威力判断
- C1 ?, R7 @* t6 Z' e+ u BEQ SPERTS# d: f) G* h" p
SPEINC:% u* ]$ o) ^6 W# h
LDA $88,X ;读取武器值" f W0 k1 n; a3 p, B
CLC
% I2 L/ q/ |% G5 M# E ADC #$085 z$ f/ k: J% Z2 Y8 y7 g; N
STA $88,X ;威力增大 R, s: a% ], g
. {; X; K8 n1 |6 P
SPERTS:( z0 a1 e8 N6 m, G" ^
RTS" d* X8 l5 ?3 B
' t/ }/ v) l5 ~3 B" _; r
BULLET_NUM: ;子弹数目
2 q* Q+ B3 C. ?- L. G" V/ n, i LDA pause ;暂停状态判断' ~6 u. t W' w' o, p" W8 D9 N
BEQ BULRTS
' w( `8 p8 ]; j: C# D CPX #$00 ;主机玩家判断/ `* Z+ s3 M Y1 F" |2 K) Q# A; n
BNE BULRTS# J! T) }9 G9 Z. m
LDA $04,X ;主机玩家判断
. U+ W3 S, E0 [. H& q& E, f AND #$80 ;按键A比较) a0 ~9 Q" s+ n1 t, T
BEQ BULRTS
: j5 H& e, S) j, U8 U: L# R LDA $87 ;状态判断
2 }, h& A) R) x# w1 X' c8 L: M BEQ BUL_2
4 m& ~+ B, _0 F! E& ~% Y. uBUL_1:
; F$ u3 v3 [* @% T7 N LDA #$00- u% V, c& r' I8 N5 l
STA $87 ;1发子弹
3 ~) Q) J1 A6 E+ Z$ U- d BEQ BULRTS
7 A0 e7 R& [5 v; wBUL_2:$ @$ B3 B2 [+ A1 R* x0 B: @
LDA #$014 Q/ e) K, `0 f( J$ S
STA $87 ;2发子弹' t3 X' a/ e- s' h7 f( w2 l* U
; R: U" H, C9 [9 z$ m/ X3 Y
BULRTS:
7 h& \8 I8 P1 Y) w2 O' H RTS; P4 d5 j# |8 L3 H! E
# H8 O2 V9 D5 o' ?$ h/ _& s* T
! R/ _: F$ \( J( ZBULLET:
6 l6 ~# r6 z4 O( I U% h LDA pause ;判断暂停状态
0 E: l; n5 E. e/ ~" T n* c BEQ BULLETRTS
+ {5 M- Z' n2 {7 ]7 K0 z LDA $04,X: I" h8 n s7 v3 S) A) b
CMP #$40 ;按键B比较
: L% I- o% z9 ~0 c( G BNE BULLETRTS. j/ ]4 l) _! E$ X
LDA $6002,X ;读取副武器
) k1 L0 [- D* E; |; I, M* r CMP #$039 q: Z( U0 V5 k" _2 m( u, `% ]
BCC BULLETADD
8 U! i/ Y# n' I3 f6 m LDA #$FF
4 M. F _- P7 h: O6 m: } STA $6002,X
: ~# t" I! O/ B2 |BULLETADD:% x& z/ x% B5 e1 ?1 O
INC $6002,X
" V1 r6 a( [5 _* K& S2 N @" q
! y9 e3 Q {1 v# u3 ^/ IBULLETRTS:* L1 Z( x8 p2 L* p' ]7 D
LDA $6002,X
5 n3 V8 }+ @( K( U, R+ }# }1 n% y TAY
8 I4 E# F, d% X- @! g- n3 o LDA BULLET_DATA,Y
( E8 r; j1 T) ], |. m( A STA $6004,X ;写入副武器数据
* o$ _1 d' \5 L5 j- H# Q% h RTS
, k# o Q# v$ J, k$ n2 i. |
3 G4 o$ J. p$ z( g
7 S5 y3 ?7 _ q2 TBULLET_DATA:& ~& j0 l0 l# r" H
.BYTE $06,$02,$03,$04
4 G8 C$ X' B( i& Q5 {& c
& h- P9 ^) L6 ` e8 z- E 6 Z4 @. v: O- G6 \4 |; Q
9 r6 g5 O0 K! i/ O% l5 b; v
KEY_OPERATE: ;按键开关操作
* q# x$ ]4 @$ y. ]: ]data_protect: ;数据保护5 C# M& L6 P' Q
PHA; A! j, j4 D, T5 b
TXA' I, n8 ?' w' r$ ]5 r2 g; V
PHA0 i2 H# o! s* r! o9 C. B- V0 c1 ?
TYA/ o; w( n; b5 g
PHA; @& W" ]' e3 Y9 ?" v% X
# @6 t! [7 t' l z& @8 _1 @FLAG_INI: ;开关标志初始化
4 E& O( V [+ U% W. B
& a5 Q+ @; N! n+ x3 Y5 I: l! x LDA $600F
6 M- V' H/ A! |% V! ^- v' S1 N CMP #$01+ q7 T7 x8 \8 J H" E
BEQ pause_cmp- ^4 Q; _7 y) g* X: o7 H
LDA #$00
- {! f7 I" N; L* W9 t! e STA $6000
* d1 w1 V5 C2 v: S STA $60011 t7 N7 R6 I8 Y, m8 L8 ]4 j1 b6 f
STA $6002( e1 F8 ]8 T$ {4 `7 K
STA $6003
1 B }% Z+ T9 Q+ B) U6 q, J STA $6004
: W$ z, Z+ E, w; O' S STA $60053 u& Q5 l6 T9 {
LDA #$01
9 Z' E1 P% Z4 f# U STA $600F5 @ Z; f7 p) O8 x# I
' L8 c$ j% p d3 }9 Z) Q
pause_cmp: ;判断暂停状态1 a$ N! d9 d+ H. N, J' \
LDA pause
' [0 o. w- f( j; h1 R/ ` CMP #$01 ;判断暂停状态$ r+ q' L: m( i# | A* K
BEQ button_press- W" M# m# C( t, O' O9 L
PLA( P$ z- w5 ~% [1 L6 ?2 o
TAY
6 t0 }, m/ w) ~. S1 i. K5 O0 E. t, Q# Y PLA
, r' |! V m ?5 `# T* n TAX: h8 v# y0 T# T4 V
PLA
8 L, m# F! l) Y# `6 \ H RTS
9 S! K: G. @+ Z0 H* ^; u0 D
% v6 C5 ], J2 V; t% d. gbutton_press: ;按压操作& X1 s1 W3 F* X8 f# v
ini_Y:, P4 Q1 g4 ~/ U' w' j7 G
LDY #$00
! ] e, @, g- M' ?- B$ O7 H1 Wbutton_cmp:
/ Y" a. n/ ]$ O5 D9 P LDA button,X
0 |- |# ^( o( l/ z CMP ora_data,Y( G+ C& }4 e+ ]3 s1 g; u
BNE count_Y_cmp
& V- U4 X$ H/ T0 ?flag_cmp:* f; V+ k% U3 }. r1 C
LDA flag,X5 T/ z( `3 |( X; W
AND ora_data,Y4 L( R1 }; h/ r5 ]" R: {3 J
BNE flag_and/ R( X0 T: i( {
flag_ora:
/ V! e3 e% y3 Z6 G4 j LDA flag,X) n1 D Y* q) E: {7 C
ORA ora_data,Y
: A4 K- i8 z3 M$ ?) b$ I/ B STA flag,X
* C! F+ W- T# _: d+ A" c$ m- c BNE count_Y_cmp
* r1 r6 G8 }; H, ^; J, _5 T* I mflag_and:
, J' \3 p7 ]- ~7 f& } LDA flag,X$ ]% L$ S ~& R" a: q2 p
AND and_data,Y
- I4 G T: I8 a STA flag,X
. w- `; j% \8 ^, [ _& jcount_Y_cmp:
! B( A6 a4 [/ S4 f INY
/ \6 Z; T4 I+ G3 a$ z; g1 ]! s CPY #$08
5 g7 n; f- b" p3 ^ BCC button_cmp
5 g' q; R: P2 T, q + ~# @' G2 ?$ A0 x
data_extract: ;数据恢复
0 }1 {# T) x% p PLA+ @ P9 u2 v; y' A, E |, A. o
TAY. G# K: u1 a* @3 S9 X. i- c
PLA: d( F1 Z( T) q
TAX2 ^6 Q' g& I% f1 {, c& ]
PLA7 f- v' }# O+ x
; e {- A7 |5 x8 V& S9 m6 lreturn:
; R% m( f( A5 H RTS
1 {& \+ t/ F" a/ B5 P
' m Y( F3 @/ [1 O, j( k3 fora_data: ;按键相或数据
% i3 X ]2 O8 L0 o .BYTE $08,$04,$02,$01,$80,$40,$20,$10- a( F3 R6 d. m: a
and_data: ;按键相与数据( Y& G* R! a) m$ n7 W, u/ q6 w
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF" A2 X# P- L, y# _: H. f8 A
. ?3 f5 M ]; K, D# ^* _; P
+ d6 A0 ?8 J: d7 P5 _2 P( v $ I8 Z% d- f' c3 q+ k
;FC数据搬移程序 BY FlameCyclone( J- Y& n3 X8 Q( e# { j
.ORG $82007 k g' R# o1 |( a
JMP DATA_COPY_PROTECT/ ]& k+ ~1 n# f3 w- Q
0 ]0 R4 w$ s3 G0 r+ O
ADDR_DATA_TO = $40 ;目的地址
" ~0 k( F' S; P5 wADDR_FROM_START = $42 ;源开始地址9 W: f0 x: w# O# \7 u4 ]
ADDR_FROM_END = $44 ;源结束地址: H: P# v3 f2 c- x' H/ \; ~
4 p& m$ F% x2 v. X- l+ h5 J
ADDR_TO: ;目的地址3 z) K- D" W- i& a( G
.BYTE $00,$70$ K! i h$ l l
ADDR_BEGIN: ;源开始地址
& _: k9 j4 K+ o .BYTE $00,$83. y4 g% \) Z0 a1 l; }8 Q. |
ADDR_END: ;源结束地址# d% N( g4 }) l. H9 S$ x% P5 d
.BYTE $FE,$84
" ~. Z$ \* Z4 [" s: @; m' T* t4 D% y, \% f- \
INT_ADDR = $08 ;中断地址" R0 U6 d" D: K1 F, ^ v' \
FLAG_OVER = $71FF ;完成标志
; G' d$ ?# I: V% _, P6 P% S: n+ q5 `
+ L9 ?5 v( E9 i' o1 a% Q3 ~
DATA_COPY_PROTECT: ;保护数据0 `( i/ N4 ^ c' Y, M6 O8 I7 O
PHP
! i) w$ \5 }+ m1 ? PHA- g* L4 x' a1 _* O$ a
TXA
2 r- i6 V7 P6 E; F5 Q4 B5 X7 k PHA# |! f) L- i y* n4 i; F9 \* D
TYA2 g% `! ^& a# W
PHA9 k+ I6 N# \3 g9 R7 [3 U" K- p0 ]
LDA ADDR_DATA_TO- O/ c) L ~1 D2 t5 ~
PHA
: O9 B: V" K- r/ p LDA ADDR_DATA_TO+1
" e- {$ [8 `- f) Z, U) m PHA
8 m4 j9 H' T# F0 R8 }0 i; g LDA ADDR_FROM_START
0 A% L$ L, c, @/ H PHA
) T5 v9 R# L; Y LDA ADDR_FROM_START+1
2 y. U$ L, v. Q PHA
8 t0 ?, `6 F1 a* j LDA ADDR_FROM_END0 [" S6 w9 C2 M0 [. T# H9 L
PHA
1 ? K% L# f5 \8 u LDA ADDR_FROM_END+1
8 O+ W9 c$ n( _) P' Q. W PHA
2 Z+ p7 x6 r6 G1 _
9 L( K O' p4 OOFF_INT: ;屏蔽中断* {4 ?& P+ Y+ }, @
LDA INT_ADDR3 T# U$ e: Z! Z
AND #$7F
! D+ b; P+ R8 L STA $2000 ;屏蔽中断
- x. d2 g' o( f" l
+ @, f4 v+ N* F; T+ R: J$ L d
# q/ H) f r5 [% Z t+ wSET_DATA_ADDR_START: ;设置复制起始地址/ D1 H+ w$ Q5 }# [4 p# j
LDA ADDR_BEGIN$ o) ^" Z! L# S# m1 r
STA ADDR_FROM_START ;设置复制起始地址低位
; E& ?5 z* a3 P+ O8 o LDA ADDR_BEGIN+1
0 \6 c' D, v) a( U STA ADDR_FROM_START+1 ;设置复制起始地址高位
* f% X; v, V0 e9 c2 k1 n , p& [: {. w4 ?) Y! X( O
SET_DATA_ADDR_END: ;设置复制结束地址$ l& G. O$ L0 d) s- ]( {& m
LDA ADDR_END
5 C% ^/ P5 L, i, x3 O5 {1 _ STA ADDR_FROM_END ;设置复制结束地址低位! ]$ { y$ i/ A8 n: A) _
LDA ADDR_END+1
, F; o" Q4 l: ?0 f; E. L STA ADDR_FROM_END+1 ;设置复制结束地址高位
4 a5 x b; J o2 n" X f! I5 T 7 U. D, z5 ^% @0 S( X
SET_DATA_COPY_START: ;设置目的起始地址3 c$ y# ^: h% s! }9 q
LDA ADDR_TO' E* c3 K) l5 M
STA ADDR_DATA_TO ;设置目的起始地址低位
- ^2 _3 K3 @" ]& A' S% z LDA ADDR_TO+1
) F5 p& R- q" j* h STA ADDR_DATA_TO+1 ;设置目的起始地址高位$ d s$ L. ~2 e3 f
# J: D& Z5 i" {2 h$ u5 I5 ZOVER_COPY_CMP: ;复制完成比较& i0 S; H% _$ @( ~
LDA FLAG_OVER! \- v3 m/ E# W% ]6 R# B$ J
CMP #$FE ;复制完成标志比较
5 a, v0 c) E2 M% n* E9 b& `+ ^ BEQ DATA_COPY_EXACT
6 q3 O/ J! J T9 M. r
a1 C- H4 B* l, r5 QINI_XY_COUNT: ;计数器初始化( j8 m. _) I# o# [" w3 R
LDX #$00
3 L' i9 c- Y$ Z* h: | LDY #$00" A6 J/ T* O' W3 \/ w' l
7 ]) v% U d+ s7 V& f* PCOPY_OVER_CMP: ;地址比较3 I! \: w. t, @2 e6 g: a/ q& {
LDA ADDR_FROM_START
) U1 `9 d. \/ X, q: Q/ b CMP ADDR_FROM_END
* n* [: }& r1 f* i x4 d BNE COPY_START$ s2 t4 o; U# [
LDA ADDR_FROM_START+1
( ^8 m2 ^* k/ m" Y4 F4 a+ g CMP ADDR_FROM_END+19 N1 o) Z" r6 A' Z9 F6 r
BEQ COPY_OVER; F- |- L0 l. Z4 R" @. s
6 e* F- J: h( A2 ~5 x9 }; H: u0 F; lCOPY_START: ;数据复制开始
) B6 x- G) G8 A/ J0 n LDA (ADDR_FROM_START),Y ;读取源地址
9 l4 v+ R. Y6 m' F5 S* ]$ n STA (ADDR_DATA_TO),Y ;写入目的地址: m0 e3 I* }& J
INC ADDR_FROM_START ;源地址低位递增
) d; v6 f9 a. d+ d INC ADDR_DATA_TO ;目的地址低位递增$ u$ w- O5 Q4 x5 e1 I7 J' a
BNE COPY_JMP( v. F9 R6 _. u7 F
INC ADDR_FROM_START+1 ;源地址高位递增
3 K$ ?- f- g b8 a1 N( c INC ADDR_DATA_TO+1 ;目的地址高位递增 P; p$ {) h; r( R* G& F6 Z
/ ~( ]! P6 O9 t( X( A
COPY_JMP: $ k6 @, I$ p0 L' J; o v
JMP COPY_OVER_CMP7 [6 y: H: E, _7 [: j
/ b; K* q( P5 G+ I/ uCOPY_OVER: ;复制完成
3 X6 q' R0 w0 H$ B) e0 r: w3 a" d LDA #$FE* m, Q& i9 ^+ \6 V3 P& r- }: Z
STA FLAG_OVER ;写入完成标志8 g5 h7 d! f ?% T6 i. ]9 o5 l
FINAL_BYTE:
: x/ P/ p. m- N5 r# |0 q6 @7 } LDA (ADDR_FROM_START),Y ;读取最后一个字节% u+ ^) D( u6 R T* r9 V
STA (ADDR_DATA_TO),Y ;写入最后一个字节6 c3 E8 O$ |4 d6 Z8 {% O
, \3 G1 h" A% i: o* ]/ o5 L2 r
DATA_COPY_EXACT: ;恢复数据7 i/ l: o6 N8 [- f+ S; _
LDA INT_ADDR: {5 K! M. w, @( ~2 U/ d: x7 f
STA $2000 ;恢复中断. F- J% k9 }% Z) e! i6 M
PLA# A+ X9 K/ w0 `
STA ADDR_FROM_END+1/ {' [' w" G# ]& q1 A$ l" a
PLA# w# W% U( G3 m, c
STA ADDR_FROM_END f5 G Z ^* S4 ~ U7 [! T: H f
PLA2 {. \; b) M. g5 I$ x1 L& ~
STA ADDR_FROM_START+1
5 x5 z% Q' \/ l* m! d. N" c! i PLA
0 K" T$ p, D1 m7 N% F n STA ADDR_FROM_START
8 q3 ^; y! p& _6 v } PLA9 U6 a9 y$ N( p# P
STA ADDR_DATA_TO+10 p! S0 s1 L' z/ B+ w$ H$ U! G
PLA
c" A2 x; u) @/ z i" Q- }# c STA ADDR_DATA_TO
" u. B7 T7 J/ z PLA; f0 L" K: q; h. m
TAY
6 E' g" {) y; G/ r$ O3 [# l PLA4 A: d& c" G/ j, u2 N
TAX* `8 m0 q/ f0 T6 Z5 Q
PLA- u( h: b2 X, H9 y2 p$ z
PLP
) Y; Q! @4 f+ g) m/ N" u; `/ b ; g9 q$ S1 d3 A G9 e' C
9 Y- B" S* c' {1 X3 h
: {5 d5 ]$ F. p- P& d, E
DATA_COPY_RETURN:
/ @0 Q- M( u( X# A, k7 ~ RTS
& {2 E8 |% U& y6 X/ }
8 b; L5 i- }8 c* x- }& E) E .ORG $C056 ;精灵指令覆盖
9 {1 V8 X& X D6 F z4 L; i JSR $FFB5* Q" K6 y" c. g7 g/ I8 O8 V& o
5 m7 Z! o, V: T2 X0 M: }
.ORG $FFB5 ;: V! w' k; J! Q x7 r
PHA
' b+ E; _% s7 X; z1 l: d1 B. a- K% y TXA
k# w+ H8 c- v PHA
, K7 h$ d; F' c' K: V TYA
" Y. y/ [5 O; ?; x: V9 v% M PHA
l1 c' e; ?' F0 d5 H1 s LDA $71FF ;比较7000-71FE数据是否完成复制' f4 B# O. `% @5 Y
CMP #$FE# S5 s# v7 Z$ B) X# @& d# [
BNE ADDR_FFCA
& Z2 a4 Z. N H' H6 ~ PLA) U8 @7 \, ]1 W) v5 P: f5 _4 D
TAY
! c9 m7 P/ A X6 e% f. V PLA
& s2 A! w( d( B* b! h+ f. t4 a TAX
8 M# Z7 }9 ~' q: p/ N. ^ PLA
+ D4 `4 I2 g% z+ v; \ JSR $7000 ;跳转到自写程序
+ `% K T T: C; c: a RTS: H( n! j U6 c1 f! H
ADDR_FFCA:
9 P% l2 k: r: u8 o3 { PLA4 M7 C; r1 K; @# C4 R
TAY
8 e& \- H4 g$ n' c& b, s PLA$ F' F4 Q% E2 @
TAX+ C% j3 j+ r0 b" A
PLA
& s* A' k7 K1 M- e: X RTS% M+ @. E5 `/ O- ]' L
: R7 Z) Q& h/ K$ `# B8 j3 e7 u8 Y/ O
) u! t3 z. h i1 L0 y- n8 Y/ U .ORG $C264 ;自定义的MAPPER2切页程序- G2 n* a6 W& D: C' f
PHA# e3 e. _5 ?$ W" q7 Z! Z$ Z
TXA
8 b0 n7 l) K2 T1 O2 W& E PHA* {% h% h+ S% Q. o
LDA $0066
7 f" V8 s& G4 u9 Y& }, o BNE ADDRC280$ q* b9 f6 ^% j* l6 d3 p, H3 N8 B
LDA #$07. R, Z" ?) }0 Y! E' P2 H. v
LDX #$03
1 Q* \/ R3 u. d JSR $CD9B ;自带的切bank方法# x* Z1 c5 g5 [' a- d
PLA
! _2 O/ m5 L- i0 K6 `! i( d- f TAX
9 h$ R4 H, g/ l$ g PLA$ K( z+ i! n, x# s
JSR $8000
! w& ^* u. {. a5 H' t LDA #$06
, ^# O; J' d h2 [" m1 u3 Z- h0 d7 m7 e LDX #$03
* C5 T$ {: [5 [ JSR $CD9B ;切回原该切得bank(可以不用)1 }/ _1 B' i9 j9 E/ K* A2 w& Y- z
RTS
' P5 q/ {* Q9 \0 q- nADDRC280:+ h/ B4 B- s2 E2 V* { }
PLA6 u k9 @* l- D3 n( c$ [6 Z; N
TAX5 G8 {, j2 t4 W; s. A1 o
PLA0 Q3 y. T9 Q6 _9 Q
RTS
V& W9 e8 C' _$ ]
1 u4 Q+ D: J0 w! {' j: ?$ A + q/ `; G; s! |% R. V: X* r
;[FC][最终任务PPU][END]1 k' ?4 M- ]' G8 ^2 d+ \: {
.ORG $C056 ;跳转到PPU重写程序
0 N" }! G% j* D7 C& u! |1 K JSR $7000& M' x1 p( {5 a1 \
1 V, f( C, E) J7 L4 v' q+ W
.ORG $CEBF, N# }# |1 {5 y& y# r# x7 S
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入
% ?5 ?- _; ?# L' Z4 l$ s8 E! W! p . v3 L4 o. P7 ^0 c. u3 z* R
.ORG $E460 J! g8 ]% e/ Q+ K& D
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入: ?: a8 s" g" H, y/ @0 R/ k2 _
1 i/ E. N% k, F2 i" N$ V
.ORG $71F0
8 i1 u" d* ~1 F8 r6 vSTAGE_DATA_WRITE:# E- `( c: U& b$ D* P
LDA $6010" R) W a8 ?% _& V: f9 ^) f
STA $1E ;关卡写入: Q, s# d; G" g5 q4 b- M
LDA #$00
. {5 ?: R! X- y) ?0 T RTS5 x2 L' K6 \" X4 s3 I6 L
.ORG $71C0
" K; X2 M* e: sBULLET_DATA_WRITE: ;副武器数据写入
* ~& I3 H" M1 U8 Z% T CPX #$0E
6 J1 `) l/ G, r3 f' x BCS P2_BUL0 v& l% U1 W, [4 H2 h+ g
P1_BUL:$ Q D5 E, i2 {+ D
LDA $6004
. \* u1 |( f5 l- P: M- o* k. |$ X JSR $D7D0 ;P1副武器数据写入
9 |* w% k$ d! G; N! Z6 P" ~2 R A5 O; d6 f RTS
/ K' f# a" X) g' Q$ q7 dP2_BUL:: z) Y7 ^6 x- \$ D
LDA $6005
: T" Z* {3 r# g0 K. ~ JSR $D7D0 ;P2副武器数据写入- H; P$ {! o" ^4 n4 _. e
RTS
8 [+ E' V' c" M8 o8 |+ P$ J) d& y5 Q9 V- j% P8 e
* t0 Q1 V7 n$ E) R/ b4 Y% g7 w
.ORG $7000
7 X! x# V: y# l: }6 u2 [1 H3 T, O
2 ]# w( s! Q5 T- f8 ]. m STY $4014 ;补上覆盖的精灵写入指令
; E) Z% b- y3 } ]8 E0 u+ t: _; f PHA
4 ?, [* S) z6 v; }3 u' |9 f TXA. z R$ I7 K/ m9 q; b4 m5 q4 X: x
PHA' P' n$ _/ k0 t/ k
TYA
- o8 {1 i' L3 \$ W. U. @7 e. y PHA
' P& `. t7 T, R6 o! }' y) k7 p LDA $0C9 d s, r @% t6 f0 M$ P
CMP #$01 ;比较是否为标题画面
0 ?- e% @4 R# ?+ n5 }* E! g BEQ PPU_STAGE! r" r/ v/ D- G& g9 P
PLA
0 x' D7 e4 h$ Q; s' S! s8 w TAY2 K' F$ V+ ?. s5 M, g
PLA+ M$ W x+ n! a8 A" e* n
TAX5 s+ y7 h' |2 q* U' Y
PLA5 n, {, X* J, B! W* O4 V9 a
RTS$ Z7 `) {) u5 N' t# C' F
PPU_STAGE: ;STAGE显示程序
1 [, v& j+ {6 ]6 q0 L LDA PPU_ADDR_DATA
4 S4 Y1 T0 o! N) V1 l2 n% i STA $2006! ~9 |; D& q; H, A0 G/ ]
LDA PPU_ADDR_DATA+1" M2 d, U$ t) |2 E' e) P
STA $2006 ;坐标设置
3 K. \3 b, p1 Y- D0 q5 R& [; p+ w LDX #$00
( I0 e7 ^8 ]: b1 n: V) ^% }% P7 ~4 }2 }PPU_STAGE_WROTE: ;写入STAGE字模
- t3 u% T) Q6 B W& f' A LDA STAGE_DATA,X
: T6 } V0 x: p1 }5 ?" J; V STA $20077 o r* O5 y& i" z# D" [
INX
0 i0 M8 G, O& ?/ I+ Q/ F5 R CPX #$06
# E4 u4 x5 g! ] s0 d0 _ BCC PPU_STAGE_WROTE
( l* [) g1 i" Q0 g1 i: d LDA $6010
! j; K4 \0 v/ b' b. X' @ CMP #$FF ;关卡数据初始化条件判断# J0 s+ y$ n- I# E0 g
BNE KEY_B
$ V) Q4 z2 Y+ j+ I2 ^( D) o LDA #$00
# o, K! O, w5 c+ B. @ P STA $6010 ;关卡数据初始化
: D; \; D& r: I3 P$ I: A qKEY_B: ;关卡减少
& _% _! N4 o8 R0 D4 P/ f& i LDA $04
- S- a5 }" ^% C: d5 k J" M% f5 d AND #$42 ;按键B或左减关
' C( k8 H4 r* N' V! {) k! t, k2 B8 a: D BEQ KEY_A- Q: [( o7 K* ~' ~( ?( t
LDA $6010& Q9 R/ D! b4 g, I
CMP #$00 ;关卡比较6 R8 B! ?9 b9 y2 e; s2 j; }2 `; z
BEQ KEY_A7 t% R) ` @; o: g8 c
DEC $6010 ;减关 @/ \$ P1 R2 A+ |
KEY_A: ;关卡增加
5 m. Z0 w( L' z0 B* o( Q LDA $04% B7 B5 N( X: O6 c# j% Q' g4 v& P
AND #$81 ;按键A或右加关( |1 I/ o" K$ ~+ E2 M% ^+ |
BEQ PPU_NUM_WRITE
! _$ B6 w9 L3 ^. H& Y# g LDA $6010+ W1 ~+ `( l( X; _
CMP #$04 ;关卡比较$ K* }- \9 n4 K9 z! I
BEQ PPU_NUM_WRITE
; a7 ?4 Q- s4 d' ^$ m INC $6010 ;加关) W2 c( |7 D+ K( p# _
PPU_NUM_WRITE:0 n9 ^. z8 @- G3 h! p
LDA $6010- o) w% ?2 f& Y- \8 N! _$ `
TAX3 |* Z$ @/ p$ Z% t
LDA STAGE_NUM,X ;写入数字! R# q- | D# ?, Q* o, p
STA $2007
) D2 t: A! n' l, D- s0 @PPU_RTS:, T: f. n+ G# n/ v e5 T
PLA- Q8 t$ [+ @$ R2 R* o
TAY5 L/ ` Q- L3 V* y" L, G1 G7 ~$ H! r
PLA
; \/ L# W. i9 x [& Y TAX3 ~" A1 y- c% y0 t0 B& |# ?
PLA3 m8 S q! a6 L; A
RTS7 O' h3 D1 L# [5 ]" L6 O
. @1 q) V* N% g- D. ^
+ X3 a! h3 d) s1 J! K3 t( S, u
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
: f: H2 }$ y j! R1 S .BYTE $EC,$ED,$DA,$E0,$DE,000 d' E" w, g2 W
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据
0 R: W4 }1 q8 G* y7 R- b .BYTE $D1,$D2,$D3,$D4,$D5
3 W3 k- \# K1 i$ y' W$ G % i3 s( X" H0 O
PPU_ADDR_DATA:) x0 s2 `+ q9 |: g
.BYTE $23,$0C B4 M" T2 p1 b9 f
4 A0 t+ r# u) Y( A2 Y& d
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|