|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑 ! U1 e$ k! w2 t+ z+ Z/ k
: X. K; p3 s; W5 z3 H. G& F: ?* q
得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.! `1 ~. J0 W. k* G& |
然而,今天想到一个思路.+ G0 w8 d- t. ]* M
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.: R9 h# j s) v: I3 R; P3 W7 d/ E
2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE& }: q: z J( k/ D/ G
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).0 |9 E g$ Q1 a0 u$ {5 H, C
) H8 \2 X5 d& O% I7 ]* y! U$ }$ A: e1 ^! D
;[FC][最终任务KEY][END]5 d' a* D! j+ W+ B
button = $04 ;单次按键
: y2 t8 R+ i% F* cflag = $6000 ;功能开关标志
" T2 A, k; b; i# v% E( A, p6 Opause = $000E ;暂停地址4 v' X8 O2 O9 A7 B) T0 g$ g
; x6 }! g; Z s4 x# J. `4 k
.ORG $8000% ~' @- k9 v {. I. U
LDY #$08 ;自带的按键程序
( R# X! |# Y. L% yADDR8002:+ C5 t* s9 H$ d' L
LDA $4016,X
% u& `- n& ?0 P* i3 ^# f. g LSR
3 j3 R# O, R; i( U ROL $0021/ z- I9 }# y; R6 n
LSR
% ]9 L8 d, h2 e/ c ROL $0029
8 M% v1 J# [$ R: ] DEY
2 M1 R; t: p" k9 l- w BNE $8002, H+ J _/ p' H/ r
LDA $0021 W1 g1 t5 P# r0 U: {& E
ORA $0029/ [! u0 B3 d: P) c0 J0 T9 J
STA $0021% P/ J% v( L' f6 d: Y4 G
LDA $0020
8 a' p; @8 I- J Y AND $0021
& q9 ~/ ]( H5 I2 K! y STA $0020
! U( } R, T( c' k5 T$ j LDA $06,X
( [1 K" {8 x) w3 [ U+ m _" B EOR $0020
0 A& l9 r, i% k8 I6 a4 C AND $0020
. k d/ N5 f. [4 Y1 ^; V6 k( V/ C STA $04,X
) R, q0 G4 X2 k LDA $0020
# I/ o! {6 j! Q" k( v8 a STA $06,X& s3 R6 y; w9 W9 x* T: x
JSR KEY_OPERATE
# z3 I4 ]8 H. c9 s JSR Function ;功能调用
& K' x. g! s1 }1 R4 m, X JSR Weapon ;武器切换调用9 {* u; D5 I {) x" G% r
JSR Power ;威力调用
5 y" _" P3 ?3 v3 y3 U* m, X JSR BULLET_NUM ;子弹数目$ N8 o) f2 s8 J1 C
JSR BULLET ;副武器类型. X- h2 p8 Y# I! U) \6 [
RTS! c0 a6 n! n9 P0 h" G# I; u8 I* O
5 d y; j" A, q4 T0 T$ r
2 M e9 x0 }2 c/ g+ Y/ H# x% f
0 e1 D/ V, l# `' i8 s .ORG $80503 y0 ?! v4 j% ` d# L3 V9 Z
Function: ;功能8 q9 b" M6 M; A2 | u
WUDI: ;无敌+ |; q/ |! e; }6 q
LDA $6000,X4 ?, w8 d! j5 V' \: e- A Q
AND #$08 ;开关判断; g2 f3 X! ~3 {% A3 E
BEQ LIFE
) V. B# ^* j- F, N8 H! X# H' m LDA #$05
: ~& f( E2 y2 P0 x STA $05DC,X ;无敌锁定
* m( k0 v- K; {LIFE: ;生命
6 ? I" C. o1 \5 E. h) v2 T9 z LDA $6000,X8 E7 R' b" Z) g
AND #$04 ;开关判断) Q0 _. T3 ]0 ~" ~0 H2 R: r) H8 H
BEQ FUNRTS7 Z3 T7 E# N% b. k9 X8 h
LDA #$051 i- f! `1 B. h! g! G
STA $1C,X ;生命赋值9 Z" t' i/ T& Q5 k' R
FUNRTS:5 J% c; c+ g; \& D
RTS& C! S4 N+ S' i8 f
" U Z. `, [4 h4 h; g, z$ {; {/ _
Weapon: ;武器切换
/ Z7 O1 R7 S7 l9 t$ e5 f' z LDA pause ;暂停状态判断) S& P: a6 S5 t6 @, n s2 j
BNE WEARTS! K2 P, H, S0 n
LDA $04,X/ Z! G9 n- k2 w: R9 t
CMP #$20 ;选择键判断
' S) s, k4 V, E. d3 Z BNE WEARTS
5 Z3 Y1 ^2 _+ s, ~' Q# c LDA $12,X
: n) F y+ I6 l E0 b8 p CMP #$03 ;武器值判断( c. R h/ W* v- O, |' O$ G
BCC WEAINC5 U0 l7 ~0 T' @1 a
LDA #$FF
1 q' C5 X) ~) V1 Q STA $12,X ;武器重置& J. @' `6 n8 t! Q( R% P8 o9 p
WEAINC:
$ h7 @; i( R, b, l+ |% {$ e INC $12,X ;武器增加
8 f; g6 g2 k3 Z" Y5 W+ p 4 l. n, X/ F5 W8 E8 ^- {( ?
WEARTS:
# R; Y' `) o4 F RTS! F' ?; w7 j, q5 G. b( X* ^0 F
9 @. }0 a5 G2 J& |! z
Power: ;威力: a. u, x) _# b- R% W
LDA pause ;暂停状态判断3 S/ _+ z/ x5 o R; b( h
BEQ SPERTS: I' t4 A( U$ C+ a; h& z# t, ?
BUT_LEFT:
: f' b3 A5 Q$ I+ f" Q8 T$ M LDA $04,X
( c! K- i" Y- x0 O CMP #$02 ;左按键判断
. r( g% `3 t" N3 o BNE BUT_RIGHT
3 O9 ` D- R' ^4 q$ e0 V' f- Q LDA $88,X
: A& o0 s. a4 w5 x4 y* x- z* A I1 q CMP #$00 ;威力判断5 z9 t2 N1 d1 Z- u5 [ B: |
BEQ SPERTS( s3 h9 [ C! k! C; t* w
SPEDEC5 E$ }' ] `: l- t" B, u
LDA $88,X ;读取武器值4 }5 p% I5 U" I y6 ]1 P* R# c
SEC
% b* l( V1 a. C SBC #$08
. Y3 |- D& u6 c2 b {7 z' ~0 h STA $88,X ;威力减小
" _% E5 v8 V$ g5 \BUT_RIGHT:" U& A3 l. c. n' \' D7 L; X7 B
LDA $04,X
& ]% K. ^ j @- {* W" i& K4 U CMP #$01 ;右按键判断
4 H' W* N: o* C) \2 s2 H BNE SPERTS
) g2 b0 {/ K) W( E4 } LDA $88,X7 b. R$ \, Z c p5 o0 K4 l5 l% K
CMP #$10 ;威力判断
8 E$ C% b3 w3 d; U( I* J BEQ SPERTS4 I( N( ~. o h w+ G6 H( _
SPEINC:% u8 ~! Q4 m9 R' F
LDA $88,X ;读取武器值1 U) N! r! A- {& C+ \# x0 ^3 p
CLC# f/ m) z' O) z3 U. L
ADC #$08
q) Z7 n6 L$ d4 ?. ]5 X. A/ D STA $88,X ;威力增大6 [6 p0 Z: s; L' ^' z
- j& _# \8 `8 f2 v- w5 z& C0 D+ XSPERTS:9 t' V; R. G3 Q* F0 c8 h% K; C- s
RTS6 L9 ], l9 e# o. k% O: o1 b% o
. K; l( l2 u$ Q( P' q
BULLET_NUM: ;子弹数目
5 R, y9 C/ f0 S% ?6 z' W) i- B LDA pause ;暂停状态判断
& J/ m; ^0 v+ Q' Z- T. A. l+ ? BEQ BULRTS `) q7 f5 [- T) Q
CPX #$00 ;主机玩家判断
. i2 b- v1 b. t/ u) b BNE BULRTS
1 z1 s+ D8 f9 j" _3 D( Q' z" J- { LDA $04,X ;主机玩家判断1 x, ~+ f$ Q0 F, X
AND #$80 ;按键A比较' H+ A. s* `5 h
BEQ BULRTS
! m& Q& D# _! [) }$ ?% l/ L& ?- B LDA $87 ;状态判断
2 Y+ J/ ^& ^& f6 t0 w/ b) @6 } BEQ BUL_29 X, l8 Q+ j/ A5 {% N! \2 B# V
BUL_1:! P. o, n3 D$ r
LDA #$001 z- `2 ]6 i6 \! X$ ~( j) g
STA $87 ;1发子弹9 G; M+ ]; s# }1 w
BEQ BULRTS; ]2 Y, z0 h' P) n* z4 V# e$ o0 r
BUL_2:) k2 X% u2 U+ A E% o* w: x
LDA #$01 C9 X/ K! d! E6 D
STA $87 ;2发子弹
) U" l# n& @1 P5 ^$ l+ q& P; v 5 b: r1 \' q& N7 z
BULRTS:# h; G8 Y8 `( L) w* r
RTS9 s, {$ B7 |" P% d$ q
1 s! G8 S5 w* }' J! f
# v: h+ i6 s# L
BULLET:$ Q% M* A: S8 j, F; i
LDA pause ;判断暂停状态
. i) X) a3 e( o! p' R; V BEQ BULLETRTS
7 q4 w$ k( U# ]8 s3 R: U; Y0 j4 Y LDA $04,X# ]3 B7 q, Y2 U" J. k& D$ `7 v
CMP #$40 ;按键B比较
. ?, P) B9 h1 I1 u, S0 M BNE BULLETRTS' ]! K E5 A0 L$ z0 o
LDA $6002,X ;读取副武器2 x) Z3 H9 \$ J3 z
CMP #$03
1 Y m3 v8 a# w: @$ t2 X) ]2 ] BCC BULLETADD, X0 s8 u5 w. \4 q1 s! E
LDA #$FF
9 _+ v2 F: E5 p# W; `0 F. F STA $6002,X
5 l$ x( P: j8 ~" o A) h: oBULLETADD:
. z; Y2 G$ O1 c/ y INC $6002,X
+ Q; r+ N3 l/ M! r3 T/ Z0 C& `4 m 2 |; E3 y9 `8 s
BULLETRTS:
( D' p8 t( _5 ~( |& X LDA $6002,X
& r$ [! x7 q1 i2 ?; ~0 n TAY
1 ~+ w) ?2 e* |8 `5 q- u+ c LDA BULLET_DATA,Y8 ^. l, j6 d" t: T
STA $6004,X ;写入副武器数据
# @2 p+ Y6 [- T. X h& { RTS" w! K, y6 [8 _: ]0 E' m2 b/ l
+ b& v) v$ l# s, F, s9 B 8 E+ A' A1 x# W5 f1 p% o3 [$ V0 n' a3 ]
BULLET_DATA:
& q: k; R* y! t/ N0 F .BYTE $06,$02,$03,$04
9 V. Y- D. ~# Q/ M( U
6 h1 u4 L' e6 p \ T7 q$ u+ E" F5 ] 0 u. W8 z q9 z! F$ |
% z( n) O1 M: T- X# [KEY_OPERATE: ;按键开关操作% T4 t) }9 u) G8 D- h7 c3 v
data_protect: ;数据保护
3 p2 @8 Q7 ?& O PHA
% p6 v6 x! Q: Q/ w TXA4 K" b+ `! J0 n& l( q m
PHA
* b: M% b: ^ x1 Y$ P9 o TYA" \$ d) @# q0 ?2 R( t0 I
PHA, v* ?: S' I0 F4 i' j+ t+ R
- M! o4 Q3 C1 ` v) t- NFLAG_INI: ;开关标志初始化# w1 ?- Q6 n7 U Z1 A
" h1 P4 x, V( X, \- l
LDA $600F
) X' C0 L7 H$ H4 z j CMP #$01/ p( m" S6 D1 c
BEQ pause_cmp( U* [" l6 |( _( b) }+ y0 m4 Q
LDA #$00
* d. ?- l* k5 ?& X* \/ m STA $6000% L* X( L# e& J6 I
STA $6001
7 q1 ?6 }$ ~$ s* u3 d& P STA $6002! H! v6 t) Q! L+ u# q9 T
STA $6003
9 ~6 V# o5 k- }* _3 h STA $6004
1 \# Q* `7 }# k STA $6005/ f% [& V+ k" G3 t0 V1 M
LDA #$01) B) T% v' x6 }# ^6 s
STA $600F6 h) ]- H ^* b
. i! X4 l9 _; a: dpause_cmp: ;判断暂停状态
5 e( H& I' o7 y LDA pause, M' K' R9 Y( K. V0 g9 x) H( K2 r
CMP #$01 ;判断暂停状态. Y$ d7 t' ?9 r, _. V( W& l
BEQ button_press
* G8 |" Y' e; E+ E8 P, f8 {' h PLA
( x$ b' V" l4 p b# g% K TAY
4 o2 p- v/ I2 g% ~ PLA
( T0 Q& k0 c: G3 c0 K7 B7 u TAX
! C+ w1 Q7 Z% V3 E PLA$ }+ [ [1 r8 [
RTS9 ~- R# l1 W9 e: m' b! k
) j6 d0 g6 _) E6 v1 U2 T# B5 I* R7 ?
button_press: ;按压操作6 y E' ]9 |1 c/ l
ini_Y:3 C: f6 H* V4 v' a( e2 g
LDY #$00
2 v) X S- `0 V% p2 [+ e3 `' A3 [button_cmp:
2 o( @! A& O! K LDA button,X& w9 ?1 h: l' C+ r4 c2 r
CMP ora_data,Y; v ]" |0 }& ~8 r. k! A
BNE count_Y_cmp
U9 P* C% p b8 Dflag_cmp:
/ N0 U6 b# O7 }5 ^ LDA flag,X
" a: v# t" U/ h AND ora_data,Y. n- c- @% N* [3 E5 R# r/ q! W
BNE flag_and
3 f, q6 s+ e4 O& Yflag_ora:
. [1 E! V: u. w" h LDA flag,X) }2 P& T3 x$ G, I4 A8 a
ORA ora_data,Y
0 h& S1 M9 t9 T; A2 t2 @0 I STA flag,X
* R X) ~! I4 N) F& f3 A3 [ BNE count_Y_cmp4 f6 |, f$ g* r" C
flag_and:
' f" c; r5 c, i6 s3 d LDA flag,X! L& n& Q: k5 ?0 {( T+ N
AND and_data,Y Y1 V! e) P. D9 X( w0 Q3 w2 P ~4 k
STA flag,X* r: ^' t- f% x" E; k z; V: W
count_Y_cmp:( \8 l( B4 n7 | e
INY& L# i U/ M9 o9 L% k" @5 c
CPY #$080 K0 s) c z% O9 W/ h% L2 f
BCC button_cmp
$ E5 @7 e5 _" C ) y: O" C$ @) r
data_extract: ;数据恢复" b) o! U) {9 ^$ e9 l
PLA
+ h3 D/ Y6 Y+ a# B! ?) @ TAY" S# L; Y8 w. G9 ]$ v
PLA
h% n$ F2 {& J1 J TAX
% h% c1 _, k) r$ u PLA
% y* F/ m. h+ B8 C + `& I. r. Z( L f! M% w! _7 _/ Q# c
return:
% E3 T7 L! {" S& Y RTS/ e9 h( S8 r- g. r, c
0 q* c- B$ x, V' _ora_data: ;按键相或数据+ o8 k" B6 \- l( b& _* t) I
.BYTE $08,$04,$02,$01,$80,$40,$20,$10
3 C. ]0 K7 d3 l h7 band_data: ;按键相与数据* W- g+ w0 k0 P8 ~) q
.BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF, J6 K7 U( ]5 ^: }
4 W1 {0 i! G; E; e# b; p3 @% z
, P3 U* y( m" ^% f( Z; M' q . `( a/ E$ l# r
;FC数据搬移程序 BY FlameCyclone
! z- u+ a3 G$ R% Z .ORG $8200, {5 ?% f3 y9 \- Q# X e
JMP DATA_COPY_PROTECT, q' V1 i; ^/ o) r9 z
, o4 I/ \; r* l" U. y# C PADDR_DATA_TO = $40 ;目的地址
% p) q0 n7 U1 _- B; ]7 z6 `* n- uADDR_FROM_START = $42 ;源开始地址: f% ?# j- ]! ?/ Y, _
ADDR_FROM_END = $44 ;源结束地址% a& k8 @! [" T- v& c" `
# d0 ^) y7 F9 D, R$ z8 R7 n$ l* xADDR_TO: ;目的地址
; F+ V. X- P* O& F7 N .BYTE $00,$70 w* N/ H4 p% V
ADDR_BEGIN: ;源开始地址
( ~. Z; r: F' o/ g) G .BYTE $00,$83
# A( W$ j2 t bADDR_END: ;源结束地址
7 ]( B$ b: I6 @! J% N .BYTE $FE,$84
, L- Z/ ?# L) n" w2 i1 S& K3 ?6 O; `$ y& [# C6 ^( q& ]1 x: h
INT_ADDR = $08 ;中断地址8 j! H) z/ l& e9 _7 ^
FLAG_OVER = $71FF ;完成标志
6 A M! D+ ]/ e7 i5 r& p/ {, q& K' w
7 J% Z5 \: s* s% X. c" h9 O
: z9 d' g5 V5 h0 q$ u% dDATA_COPY_PROTECT: ;保护数据7 ?- R2 z1 B; N, v1 [
PHP
n- Q* v: M" a6 D+ Z' D' } PHA9 D! V# p$ N9 i, j
TXA
7 d6 B4 ], M. Y- M PHA
* v0 Z; N2 e7 w+ c$ @ TYA
8 w# c, X- E3 N; I- y: C( i$ V PHA
5 Z q: K; @6 g& G' S# V) K LDA ADDR_DATA_TO4 [3 b; O# ^( ?# b$ {
PHA2 J; }8 e. t+ `
LDA ADDR_DATA_TO+10 M, A' h+ A" W0 u
PHA
! \' K) m; o5 o+ N8 Z LDA ADDR_FROM_START, f& L+ G* y+ q/ X$ h3 I: U
PHA# [1 z3 S7 h' E: G
LDA ADDR_FROM_START+1
7 H1 t% l& ~/ U _% o PHA
% \8 a- u- K8 l; Y( \3 B/ m LDA ADDR_FROM_END
/ q6 J/ e. M' I9 |) D# K6 k4 r* ` PHA" f& H" T. ?& @) s
LDA ADDR_FROM_END+1% k. a1 f5 K: H- y1 n( K0 J
PHA" i i$ z* l' M Y. {$ X
2 e$ f3 |' ^$ H) v1 l7 V( l
OFF_INT: ;屏蔽中断0 r* s A; K% I- s
LDA INT_ADDR
0 T* U! k2 _2 a q AND #$7F9 P6 H0 ^2 w# j1 X/ d& K
STA $2000 ;屏蔽中断8 Y4 e, x3 `" C5 Q: `' d: {$ C% P9 P
1 J9 ] Y2 K. }5 h
/ Q$ w8 Y* P! Y: D) Y, }SET_DATA_ADDR_START: ;设置复制起始地址/ A4 ~7 T4 e/ X$ Y1 a
LDA ADDR_BEGIN6 R! ] t! f9 N! `8 H, z
STA ADDR_FROM_START ;设置复制起始地址低位2 B" C; h+ `* \ l9 |
LDA ADDR_BEGIN+1+ W) s$ d) o( p
STA ADDR_FROM_START+1 ;设置复制起始地址高位5 S7 k# h! F [( }4 ?5 T
0 Q" h: b; ~& B! U/ aSET_DATA_ADDR_END: ;设置复制结束地址# E& T7 T4 D4 c
LDA ADDR_END
# f! e+ ?4 U; v# b4 D8 r4 _5 G( O STA ADDR_FROM_END ;设置复制结束地址低位" X( {. `) _2 h3 Y- Z" {
LDA ADDR_END+1
' W! T4 H9 Y/ g+ z6 k- O0 j STA ADDR_FROM_END+1 ;设置复制结束地址高位
8 a7 `6 W* @: w6 c + i. p+ L% M7 l$ t+ _( U* D1 ^- U& Z
SET_DATA_COPY_START: ;设置目的起始地址
7 }1 G Q' B/ d( U: u LDA ADDR_TO& J& E5 @, G1 Z M7 W& C
STA ADDR_DATA_TO ;设置目的起始地址低位
. | i2 e- q% ]0 [ LDA ADDR_TO+1
3 R0 D+ n6 c5 X( H; ?3 x/ H STA ADDR_DATA_TO+1 ;设置目的起始地址高位+ v% _# _: x. V& {
' V6 p- v' @% E
OVER_COPY_CMP: ;复制完成比较
3 k6 D7 ^# z4 @, [2 Z0 o: d* S LDA FLAG_OVER
: e3 n" I' y6 d$ z* ?1 ^; S CMP #$FE ;复制完成标志比较
p/ v9 a1 _. e6 G BEQ DATA_COPY_EXACT
: B. o1 q% h- h- F- H, x/ r' ~$ l% D0 O2 J5 e7 j& T( k K
INI_XY_COUNT: ;计数器初始化& z$ Z* ~# ^! t( s4 ?3 Q3 s
LDX #$009 u/ z8 b: ]- i$ [7 @; H4 m
LDY #$00
/ s5 j S& ?2 j5 T! b2 Y( o' @ f
, w2 x0 T7 w, g3 u& eCOPY_OVER_CMP: ;地址比较' s9 q; S3 ~9 g8 y" o1 J$ l; P
LDA ADDR_FROM_START) \, Q+ ?$ N% w) N
CMP ADDR_FROM_END
# ^, W4 z4 T/ n* [ BNE COPY_START
! s. j# E- K$ g2 g' J LDA ADDR_FROM_START+1
$ f2 j$ S8 S2 V% X CMP ADDR_FROM_END+1
. e! j* n2 x$ K. o- S BEQ COPY_OVER o/ f. s5 S- i. {4 e3 f. y
: C5 [9 s! u: e" P3 LCOPY_START: ;数据复制开始. o1 E( x2 Y H b0 G# x6 @' ]* i
LDA (ADDR_FROM_START),Y ;读取源地址0 O4 g Z3 D( j y& s% u
STA (ADDR_DATA_TO),Y ;写入目的地址
4 _1 F! Y8 p$ a/ T INC ADDR_FROM_START ;源地址低位递增
7 J( g+ q( n W. f* c- Y8 i- h4 I INC ADDR_DATA_TO ;目的地址低位递增+ d: s/ f6 N4 o4 [: T; v# `
BNE COPY_JMP) Y$ @% B8 d4 ]$ W0 k# e
INC ADDR_FROM_START+1 ;源地址高位递增
2 I% |7 I8 o, [ INC ADDR_DATA_TO+1 ;目的地址高位递增
% r) K: [9 f; ~1 m7 k
4 e9 i9 P3 {' x# }6 H2 E% DCOPY_JMP: ' m% v) D+ @4 I' j
JMP COPY_OVER_CMP
: ~( T0 D/ c" ^( [
5 M) R$ ]0 }$ `7 ?8 }# \COPY_OVER: ;复制完成+ U+ z) |! k. @
LDA #$FE
" C2 N8 B3 u9 [! Z6 D4 |7 f STA FLAG_OVER ;写入完成标志1 Z% t6 z) c' n
FINAL_BYTE:
% [6 _: ~1 h2 z* p. K LDA (ADDR_FROM_START),Y ;读取最后一个字节* L% |5 C7 v! l, }+ s, H+ ~5 I) Y2 ]9 q
STA (ADDR_DATA_TO),Y ;写入最后一个字节2 v) r A5 v5 R; [0 l
: @5 [* r. t# k( w' f* P
DATA_COPY_EXACT: ;恢复数据
, L( W& v4 o, Z LDA INT_ADDR& S* r4 E( O0 _. `# {
STA $2000 ;恢复中断
8 r+ t9 a. H- M8 x PLA
9 H/ Q" j; |% O# U5 B# U: A STA ADDR_FROM_END+1$ | H/ o5 N# _3 S( p
PLA. W8 E% @+ q% b& ?' V. E
STA ADDR_FROM_END# M. F+ V2 F5 S
PLA$ q2 Q3 c1 w! x% b
STA ADDR_FROM_START+1
% @* j! h: m/ E0 q ^6 i! a PLA
$ q5 |; |5 l! [1 C+ C5 A2 S! I, } STA ADDR_FROM_START, d) G5 Y! x& ~* W5 j
PLA) ~7 x/ [9 c, y' Y$ u
STA ADDR_DATA_TO+1
$ u$ f) x& l# h PLA
$ o$ H* S/ l D) `. x* a' d, @ STA ADDR_DATA_TO, R, |$ J; ^. |8 s8 N; F1 R
PLA/ Z1 M7 V/ `- N& [% I ?3 V i
TAY' l1 ^" V' s$ C I
PLA
& g" C& }/ `! [8 x$ @* h TAX
* ]( U3 g$ ]0 S' D* o( I# A7 Z PLA
D$ U! u: z3 Y# v# ]" F6 z# V PLP3 p* |: B! |, t p4 B& I
/ J% G" q4 E$ l
) |3 E: J9 e5 A& `) a ' J' u2 p2 F* g
DATA_COPY_RETURN:* Q% M( k+ n# r3 U6 }8 F* z
RTS" p" |7 ]5 _* F3 `1 b2 n5 U
) u5 O$ P5 @7 [ J+ j" ? .ORG $C056 ;精灵指令覆盖; O! o9 g- u, D' e/ U
JSR $FFB5
3 d, Y+ Y0 k! J6 y* x/ p & s% ]; j' W7 }6 V4 \7 c5 ^" C8 c! ^
.ORG $FFB5 ;3 E1 F- e) ^( V9 k0 y
PHA4 N' ?3 v( G4 t* N9 m
TXA3 V) P6 V$ u, ^/ |6 J7 P3 Y
PHA* V2 j' ^! ]9 @" w0 _ U( f
TYA
4 ?5 \6 A% o& K& _+ J; e PHA
* V. g! C* d0 o) A LDA $71FF ;比较7000-71FE数据是否完成复制. h" w* d7 i3 k. M
CMP #$FE, `7 _ h X5 O- x) Y6 ?6 e: J
BNE ADDR_FFCA
5 F9 `( k% l0 d PLA; ]+ C# Y7 F' D& o
TAY* K# q s( A! |" x
PLA: L( w% o8 S$ s$ N6 Q; k3 `
TAX+ G! t' F5 f( d P
PLA* x! j% e, m8 L+ l. |( y1 O% c
JSR $7000 ;跳转到自写程序
" k, E9 x$ D* M3 w, z+ t RTS
4 V6 H. d0 M2 O. hADDR_FFCA:$ `1 c' |( }$ q- F1 x! b
PLA
1 V- w8 ~& q0 ?; l TAY
* ^; F9 ^* F& D& E PLA0 a& ?$ o+ n7 X7 G1 W' y
TAX
8 m3 X1 E9 D3 s6 x0 W' f: Z( S) J! G& n PLA }" p5 R4 a6 T! d9 L2 L4 E/ G# o
RTS' C) J) k* b! M2 V- M# n! O! l+ C
2 N8 H- W Q9 R0 a* i% }; ?' y+ W
# [' o! x# u( T6 l. q' s4 s/ l8 M
+ T [4 L" h, m. C/ L( K
.ORG $C264 ;自定义的MAPPER2切页程序. y# J3 k' @9 [% i
PHA) w; B# R# G4 W0 k: y9 D
TXA
. `; M3 B: Y+ k" F1 ?7 S1 c4 k( }& ` PHA0 R9 U' U; s, q' K+ n5 q5 ~
LDA $0066
& c6 W p: h5 U" m8 o2 K BNE ADDRC280! M) d" X1 J9 W' N0 }) U
LDA #$07
S, c3 w& |/ M5 i4 r7 }+ t LDX #$03
; f+ t# V$ S( \ JSR $CD9B ;自带的切bank方法3 M t1 ^# P) D2 b& B
PLA2 z* p! f5 U# S; j: `
TAX8 r+ h& }; K' V9 }1 b
PLA
: K2 w7 ~" J- r6 F) N7 a; W1 H JSR $8000
3 Z# D* n: r9 P# x# ]' X LDA #$06
1 k( K2 l% `9 {: u" |. n/ ` LDX #$03$ c( g4 g( o9 V _; |4 `
JSR $CD9B ;切回原该切得bank(可以不用)
" B0 @4 Y; g( j# |' x RTS
/ F3 C* k( x7 uADDRC280:
* u9 U* K, W5 R n# d+ m8 v PLA
1 r6 h3 Z# C1 S' S TAX, w, `/ T. m$ s% b
PLA
4 I( M( I6 @" Z% |- `6 A RTS; x! h1 H9 n- [7 d3 Q* Z
3 m4 v7 I- W+ o4 } H
a4 w% P& c6 E% N0 d/ ^;[FC][最终任务PPU][END]5 H$ h) C8 W8 l* o Q% _$ B
.ORG $C056 ;跳转到PPU重写程序
! r; K: ]! R8 e8 o( `' I JSR $7000* g$ b: x9 v( m3 K: _1 `' M* U
6 A! n0 A" w/ k1 |# Y9 _
.ORG $CEBF9 p! b/ R- u; d+ s3 {( M) Y j
JSR STAGE_DATA_WRITE ;跳转到关卡数据写入$ P, ?$ ]) p$ {0 c
7 G2 j2 O; u6 L8 t+ {/ | .ORG $E460
& @0 F2 d1 q5 {- ]$ x JSR BULLET_DATA_WRITE ;跳转到副武器数据写入+ u8 \* `' I+ m! f) h
3 @: _, l$ \0 h6 W3 m; W .ORG $71F0$ e, m: ~! E1 f! t
STAGE_DATA_WRITE:
# `& H& @* _' W! s9 T- L) q7 O LDA $6010
4 N) H9 D; P2 A0 F STA $1E ;关卡写入& R5 P& D+ R+ v/ u" Y( P; M, Y2 ]
LDA #$00
( |( ?5 y/ p& h- \& { RTS
) I" U! D J- @- X .ORG $71C0
. I+ _1 K4 Y4 m: y* xBULLET_DATA_WRITE: ;副武器数据写入
+ L \/ r! J% n# F! n CPX #$0E9 W8 e1 H& ^) b& s
BCS P2_BUL6 e! n6 I' K2 D
P1_BUL:
. {0 c( K6 \+ j0 I. \ LDA $6004
2 t5 t5 e' L% B* k% j# c9 _ JSR $D7D0 ;P1副武器数据写入% {- r' I9 l5 W: n, i8 W5 x9 t
RTS5 P* S4 w% N6 x5 B
P2_BUL:
; \& O+ a6 k1 S# n LDA $6005
- u3 Y* [7 e3 j: X) J JSR $D7D0 ;P2副武器数据写入# A" m0 U# P! e; V, h7 z# B* J
RTS
4 q. Y- P# M1 j4 w; y( m, Z
' n4 l' U/ ^. v) \4 _4 F9 ]+ e# ^: A5 ^, M
.ORG $70008 C. R2 Q3 `# S# o2 {% x
1 k9 F. j: H- w7 q4 g
STY $4014 ;补上覆盖的精灵写入指令9 ?- t8 @& Q& Y$ j2 H/ P0 U: Q
PHA
6 E6 P) m4 T, i* d$ W0 i1 F TXA
5 T# ^' t( U) ^9 t. _8 L PHA6 b2 K, \7 h: ~" `9 d2 e
TYA
) I2 l8 G5 V' v) k PHA
( W( r6 _8 W1 e7 P+ T9 a) D4 G LDA $0C1 R3 V/ T. T/ x" d/ J) M
CMP #$01 ;比较是否为标题画面
2 O) `+ ^3 S% C: v. Y3 ?/ ~" i BEQ PPU_STAGE" E" A: O$ _4 f4 c4 ^" c
PLA# l H/ z5 W/ ^ m# Z* ~+ d7 I( R7 y
TAY0 ?6 |$ M1 }$ w# q4 N; R
PLA
) n+ @3 J; u$ R6 d4 e TAX
$ B: D# b/ b. H8 I PLA
9 l- \5 [0 N% n. ~5 k0 s* E RTS2 t4 |' B0 S m1 P
PPU_STAGE: ;STAGE显示程序' J& }% A- w+ |" g6 \7 N
LDA PPU_ADDR_DATA
2 r! m/ M# L) }2 i6 Y STA $20069 N* ^* u1 ]2 s, N7 [, d6 n
LDA PPU_ADDR_DATA+1
( P# u: u8 f, w1 g% q STA $2006 ;坐标设置
9 B) b0 ]$ u, w% j9 I LDX #$00- q. R" I* S) Z' T& ~
PPU_STAGE_WROTE: ;写入STAGE字模, U4 o- Z& Z, u; X1 e# @1 ?
LDA STAGE_DATA,X; Q( _* h1 g) X! w3 X
STA $2007" q5 L5 Y: j- Q
INX
( S: W- ?" H3 U9 F. T, b CPX #$06
4 r$ R5 T) R1 j. i: D BCC PPU_STAGE_WROTE5 _# z" @; K5 j1 d" A r
LDA $60108 \: p Y$ s: }1 j7 O
CMP #$FF ;关卡数据初始化条件判断2 h1 k9 U/ [+ t/ A; g4 \9 u1 k/ r% [" @
BNE KEY_B+ v7 s3 l& l* K1 y8 x
LDA #$00 a/ |. F+ I- K
STA $6010 ;关卡数据初始化/ S" g( b; f7 s! k! L+ b4 B
KEY_B: ;关卡减少
+ `/ H, {* t0 P; ~ LDA $04
# R. p6 G: g% `+ G# B, I AND #$42 ;按键B或左减关
7 A# \/ L( R2 h! R) @) g BEQ KEY_A
. ?7 d- c) ^' |; S' b LDA $6010
5 C* s+ T! ^5 m- V4 }! [! U CMP #$00 ;关卡比较
7 j; N C4 Q7 D I BEQ KEY_A
+ O! V5 ^5 {: o2 J DEC $6010 ;减关
4 Z* _# j( [! w1 rKEY_A: ;关卡增加
0 ~- A" @1 ]; h z3 ^+ W4 j& q LDA $04
) q v3 V& G" t( F2 h" n l: a' x AND #$81 ;按键A或右加关% I' }/ m+ j2 r) z* U
BEQ PPU_NUM_WRITE5 w% k& `/ l9 M9 F% P0 i
LDA $6010
; w5 g0 m. [5 a5 J6 p3 J CMP #$04 ;关卡比较; I- t& L7 K$ C
BEQ PPU_NUM_WRITE
: ]! d: S% x, A3 i) ?; J1 n: w INC $6010 ;加关$ Y- G7 X% |# v& U4 i; W$ {/ R% y
PPU_NUM_WRITE:
6 H0 `6 T e0 e' Y! n3 i LDA $6010% A% V7 q$ V' }; w8 D# w
TAX
+ a1 [8 @$ X4 P2 c4 O7 i6 y6 }" \+ n LDA STAGE_NUM,X ;写入数字7 s: Q" j: ^3 @
STA $2007
3 c6 ]" Y) M9 l; N9 S1 `& aPPU_RTS:
% B. X# w Z- d' v7 C& R4 I PLA
: a q6 {- l$ j H0 r% i+ R TAY
/ C. A: _2 I+ C$ r5 a4 p: b PLA5 a/ L4 r5 b @% s( y
TAX
3 R- i, p2 B+ B+ a8 }1 n/ T( f) t& `* e PLA) Z8 w! D2 B, G2 C/ Z% {2 j" r
RTS3 A3 b+ X& e% P! a: q' j& [+ z
" L8 K8 u3 M" n
9 H# [6 ]4 Y( w: N7 v$ {* ^) J# l
STAGE_DATA: ;关卡文字S,T,A,G,E,字模数据$ x7 T- E6 h; R7 [/ T$ A- L o
.BYTE $EC,$ED,$DA,$E0,$DE,00
' c, C2 a+ _% F2 ?7 u9 K/ }STAGE_NUM: ;关卡数字1,2,3,4,5字模数据' q, N4 [4 e6 a# y6 k) x7 o' V
.BYTE $D1,$D2,$D3,$D4,$D5
. L' Y# r2 _( N4 n0 G. E/ O8 @
, d5 s P$ Q7 l% sPPU_ADDR_DATA:
9 T4 m. a2 s+ {" Z4 \- `* |. p .BYTE $23,$0C; B S% F/ i% c4 K! [1 Y7 w
/ E5 a; r& A7 T; v& r
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|