|
本帖最后由 yandagui 于 2017-3-30 21:03 编辑
! X7 _3 F8 g; q* n C% @" x
! w \* j1 w" J# x3 x f, C得益于修改思路的进一步优化,原本是通过文件的Trainer在7000-71FF固化程序,让程序的精灵端口跳转到7000执行关卡选择的程序(包括显示STAGE),Trainer在ROM载入时就把Trainer的512字节载入到7000-71FF了,本来想通过按键跳转的切BANK程序里面把原本Trainer的数据复制到7000-71FF,这样ROM就不需要Trainer就可以让7000-71FF充满我写的选关程序了,然而,ROM运行时首先运行的是精灵写入程序,那时候按键程序都还没有开始执行,此时7000-71FF一片空白,跳转到7000只能死机喽.% o4 j9 X9 I. z3 P' j; ^
然而,今天想到一个思路.0 Z' c7 s0 A3 u0 c1 T
1.找一个大约20字节的空间A,把精灵写入指令改为跳转到A写上: 7000-71FF是否已经写有数据(71FF为FE即可),有的话跳转到7000执行,否则执行原来的精灵写入程序后回去.
: N t7 c( a0 x3 R% [, k! [2.按键部分加上数据复制功能: 判断71FF是否为FE(是的话数据写完了,跳过写入程序,不是就复制数据块)没有复制完数据的话就把Trainer数据块复制到7000-71FE,复制完将71FF写入FE/ r$ i1 h1 S2 P1 l
3.这样一来就可以完美地使用空间6000-7FFF来写更多程序了(数据可以写入到6000-7FFF).
' O5 E: }, J& a+ D! A7 A" _5 Q
- N2 {7 Y# z- R
6 v f9 Z" S1 a/ u;[FC][最终任务KEY][END]
' [5 S& x& Y0 }* l( ubutton = $04 ;单次按键
* T* M3 B, r) g! Jflag = $6000 ;功能开关标志
6 T- B# Z1 p- {# Z; p' zpause = $000E ;暂停地址
' {) j5 |1 _7 `1 K- p4 r
4 k) `6 s7 D7 y. M3 r# x* P1 L .ORG $8000
; |1 \" a. @# _ LDY #$08 ;自带的按键程序3 B6 U# q( {# Q" W# n
ADDR8002:; _; }& a: W0 x4 r: |( \
LDA $4016,X
9 r$ v; ~: K. u+ U+ E. \ LSR
4 R, `$ {* H% @" S% A ROL $0021
4 ]1 u1 w' R$ Z) `6 s LSR
* _% ?$ X: T9 Z; Z0 @' P3 V0 N% c/ {- z ROL $0029
8 Z' J9 j# }: S/ ] DEY+ E6 h! `; {9 W7 V7 D+ g' h
BNE $8002
5 |/ F7 g* |& |) h LDA $0021
) w1 e4 ~3 j0 |6 n" O. p ORA $0029, U8 |9 c4 N; d' p
STA $0021 }+ V. s8 L6 P' N) l+ }6 B" Y% s+ A3 `
LDA $0020
4 }: |% i- R% B& d6 ?, H- B AND $0021! Y5 o3 ~6 O2 A0 E/ [
STA $00200 W- k. F. Q4 n. z
LDA $06,X: e1 i: F2 G6 b5 P/ a
EOR $00205 T$ P$ j0 a7 D! p) O+ [0 z" M
AND $0020
8 r1 L8 d9 {9 u STA $04,X
4 d6 u B; K0 G LDA $00200 V0 K$ [. a8 Z$ {5 n
STA $06,X# C. i# k$ f9 W9 N% Z
JSR KEY_OPERATE' r# Z: ]6 D- n. T0 ]( ~# ^
JSR Function ;功能调用
) b+ U( l6 H" f8 A( V; G! [ JSR Weapon ;武器切换调用
- K4 x$ m) o9 N& d n7 Y" y2 t JSR Power ;威力调用9 K" P0 F& `/ b
JSR BULLET_NUM ;子弹数目
* M7 \/ v+ k/ ~- i JSR BULLET ;副武器类型2 Q& j. \# v0 r, L. w( Z2 R* e
RTS
! i- P0 \+ h' h4 |2 {
& w( k+ ]5 C) e+ p 0 B) n. l( {) I- F8 K6 a m
0 e, b/ s% p+ H9 Z# r" D. u6 U! j
.ORG $8050) K: S, w. k9 v9 H- Y& V
Function: ;功能
- W0 Z4 M( T, c0 S3 @7 z6 DWUDI: ;无敌
, }5 q$ \1 b4 ]+ m( g- { LDA $6000,X! c0 ^* |7 e( C: A! x2 y
AND #$08 ;开关判断( r" T; y: D. O/ X# S5 F* b# h
BEQ LIFE
- S$ v; n! C" {8 G, J) j: e& O LDA #$054 t$ ]9 {' C5 P0 z4 Z! K. A I
STA $05DC,X ;无敌锁定; w0 ~ X! q2 N& E* b2 [, u6 `
LIFE: ;生命
' g( ?, n# J( a2 z( V# `7 t LDA $6000,X. G" n1 o4 e, x6 O5 w+ U
AND #$04 ;开关判断
# p3 r3 I# U1 ~+ f& @, N BEQ FUNRTS
5 ]6 Y5 D5 \( @5 P, u3 d LDA #$059 J" f: c- l- o3 N
STA $1C,X ;生命赋值
) X, u0 }$ |. P4 mFUNRTS:
) n; ]: m0 L6 [+ U8 S9 q5 L RTS
& r V8 R/ o$ T+ }, h2 ]4 ^1 \ c a
1 o& w: a7 ^$ X% ~' bWeapon: ;武器切换. F3 S# X% n) n& p) T+ y. n7 L
LDA pause ;暂停状态判断
- ]+ j* V* v" I0 ]1 K BNE WEARTS3 [+ k" b1 A/ T* N1 U5 _
LDA $04,X
, c* W$ `' R: {1 f% W) S% L8 e* F9 p CMP #$20 ;选择键判断
. n0 Z' E7 z* Z9 k BNE WEARTS( p6 Y: r4 C( M" }* K8 [5 ?
LDA $12,X' n5 [! o" z+ k4 t0 H
CMP #$03 ;武器值判断
: l0 U$ z; w5 P* i BCC WEAINC
3 P' Y' q0 N Y LDA #$FF% H+ w& F; U; n+ w
STA $12,X ;武器重置
5 x: v7 `) l7 ]! bWEAINC:5 V% [5 \0 f& Q+ @% [
INC $12,X ;武器增加* q; C1 `$ ?8 Q
( m/ e+ x/ }- nWEARTS:
9 v0 a9 M( g" c7 _: j0 N8 X RTS& x, ^% X% K" q* r( v" d# Z) C4 e
* Q9 k$ `1 G jPower: ;威力
' X% R1 C7 A5 q* F! k+ u+ C LDA pause ;暂停状态判断# ]0 a" x8 [" a/ P
BEQ SPERTS
; x; `/ f& C+ y0 P( c. t0 y+ ZBUT_LEFT:
; P9 i Y, q* L$ r; T3 a LDA $04,X+ U4 R1 I8 U- Q0 h6 C, m
CMP #$02 ;左按键判断
: j( e; N8 Q5 O BNE BUT_RIGHT- ?+ P" U. `- t0 g
LDA $88,X" y0 o1 U6 D6 j$ B! F
CMP #$00 ;威力判断& G1 ^' q9 g" P- _8 k
BEQ SPERTS
0 u/ E7 j# Y$ c: P# q' E! t ySPEDEC% ~# `3 U" T3 i8 j5 K/ e
LDA $88,X ;读取武器值
$ [( q9 R, j$ T; F/ q& n) S SEC9 u, c1 `! W/ d) S' k* {
SBC #$08
; d6 w/ g; S# ^- i0 F( ^. o STA $88,X ;威力减小
4 S6 l B1 X5 \ G6 J+ ^BUT_RIGHT:+ T, h/ m3 u [3 [( l
LDA $04,X
! S4 Q/ T' U, k# E4 `/ j, u CMP #$01 ;右按键判断0 y" w' H* k! k+ e6 H
BNE SPERTS" G' Y- g7 x7 W. F' @
LDA $88,X) V. D9 Z- u: A9 `; p
CMP #$10 ;威力判断2 k. y* ~7 T. k' Q- P
BEQ SPERTS
, Z2 ~& c h$ o1 pSPEINC:
$ h y/ J4 p3 J* E2 i3 A8 D LDA $88,X ;读取武器值
! Y7 E* s0 k8 f- \ CLC0 A. ~0 _' t. P
ADC #$08
! S! v8 n9 n, b- `* e STA $88,X ;威力增大0 K6 X S4 h6 }! N! b
5 l4 \, j1 u- }8 f: |# H0 PSPERTS:
; e- ~: C7 D2 V) Q RTS
# C7 Q7 ]2 T' B5 ^, c% S
+ t1 N" K; t3 v: H$ X1 h cBULLET_NUM: ;子弹数目
- v6 m/ o1 M# B& z, b* m LDA pause ;暂停状态判断
' p B% t. P# p2 d0 ~ BEQ BULRTS
" [2 x+ L$ B' g; B CPX #$00 ;主机玩家判断
. B3 P3 V# ]9 p) y# R BNE BULRTS+ d3 D6 E: c, l! H
LDA $04,X ;主机玩家判断
" O* S& v9 k7 {( } AND #$80 ;按键A比较0 T) U) H' V5 m- G3 s
BEQ BULRTS
" W+ l$ c% n6 i LDA $87 ;状态判断+ f& G8 W7 A1 a9 X: V- ~0 B
BEQ BUL_2
3 n# c) c1 F5 ]# j) b! v+ a$ YBUL_1:( [% r* e- T; c' `% f1 P" j$ ]' J8 t& z7 K
LDA #$00
. M3 t E% [* W; B2 F. N' ^ STA $87 ;1发子弹
( B- F* k8 I( G) T w3 H9 X" V" z BEQ BULRTS& y9 {/ N, Q$ g1 `4 W% P
BUL_2:5 a+ B- q( R- e3 a Z
LDA #$01
+ T* z/ W5 p; M STA $87 ;2发子弹" y8 G0 Q: a& a2 U; e
& r- x+ g" V& _' Q+ h3 E
BULRTS:
" _3 k$ p" V! M RTS0 Z* _) E2 [: B4 X+ a& M m0 ]( @5 h
$ Z. j! [/ F. l9 ? Z C# U' u; b0 ]1 Q% Q4 y% U4 C
BULLET:
. A/ P& A- ?6 @. v LDA pause ;判断暂停状态
) P4 S5 _( E6 w$ M6 f BEQ BULLETRTS2 ?& e! x/ s. D
LDA $04,X5 y, G, Y2 z* F) L! j0 u
CMP #$40 ;按键B比较9 u5 L+ a; \! t3 o5 x. e Y
BNE BULLETRTS
8 m' L( H* i$ r5 d4 w. w LDA $6002,X ;读取副武器8 |/ U! `6 G. z/ M2 X7 E4 @" o
CMP #$03
+ F9 M3 f y6 | BCC BULLETADD
: N y: C* m( F9 | LDA #$FF* i* F% S# q5 G! W6 W
STA $6002,X( L3 Q1 P6 \* Q i- a/ t, t
BULLETADD:
4 s2 r! j6 T" u. p+ k w INC $6002,X
3 c% }- S8 X' Y% p+ D
$ K4 Y3 ]3 |$ j# d: _ tBULLETRTS:
. p4 @8 ?. a2 H- N, t7 \4 o LDA $6002,X$ f( z7 d8 }; U- o& M( E
TAY
/ p& K4 e& ~' n LDA BULLET_DATA,Y+ E6 d& U' u2 b9 r) x) J+ F
STA $6004,X ;写入副武器数据4 i5 u- {- t, D6 W& u
RTS9 J( d3 U# s) i2 a$ K; d
* W6 Y5 @' y/ I8 w" x, F1 T
2 q0 r! r9 |7 H5 i% V2 b0 Q5 B( {BULLET_DATA:3 @- o2 T Z% t {: V; [* Q
.BYTE $06,$02,$03,$04
- z" n$ S9 w& `! P8 x
' T) ]$ @8 z! F1 G, {' c3 ]) @ 2 w8 z# ]; e: D/ g4 n9 z h0 |* ?
% C/ K' M( a8 ^ gKEY_OPERATE: ;按键开关操作
6 L5 P& @- r+ I+ `0 Y8 K/ P( ]5 ]data_protect: ;数据保护
q9 U! k. w" \; c- j5 n PHA7 r* K4 E& a. `) I- D7 E& B
TXA# _) A$ J5 }9 c5 n& C* @ `- X
PHA0 u8 V e0 o6 i" L/ s$ |
TYA
) a: L* H; `7 c9 T2 A/ Q PHA
" F$ x; A6 d, _7 P& ?
2 _2 Y; A9 o- d: i3 OFLAG_INI: ;开关标志初始化
$ Q/ p5 X7 h. H0 ~1 r) y, O3 a/ R; `3 ~8 u' l3 _/ P
LDA $600F
- w8 ]+ I& K) @: `/ u CMP #$01- r2 [; G+ R; M3 c
BEQ pause_cmp, D- S9 A( w1 v& {, m7 s, E
LDA #$00
4 g/ I2 V% G9 R( \ STA $6000 z* ]$ b' L1 g2 i" }$ e1 n
STA $6001. x% Z. S% F8 I7 d3 t' t
STA $6002
/ P1 t5 T# z0 @ O" G" Z& e [ STA $60036 F/ _8 A* X- A* A
STA $6004/ Y+ q( O0 C \/ T6 n: K F
STA $6005
- i/ T5 J) ~1 J) `) v LDA #$01
% q9 r p3 k8 U% e* G2 p( Y* ~; { STA $600F
2 I7 v1 }# A4 W: [9 O5 r2 H9 N7 U+ p% h 3 [8 w3 Q! x) J2 J3 O' n4 s5 i
pause_cmp: ;判断暂停状态
8 a( n( {0 q8 o9 d2 M. b! C; ` LDA pause
, |9 S" a5 F) p1 ] CMP #$01 ;判断暂停状态
% e. y0 Z) u2 x8 Y* X BEQ button_press
; @) O; e( J2 A: R( V PLA* _ S& P: Y: \* Q( |. E' ^
TAY* N$ k7 T) S B; S* d
PLA# K$ }/ a4 X6 e5 @- Z) k
TAX! }: F1 `! e% |3 X p
PLA# p) B: P6 W# V/ J3 i: k
RTS1 q& X. s; e6 c$ c
: D% k9 N8 X$ R. ybutton_press: ;按压操作- _3 Z7 ]$ X9 |7 ?
ini_Y:% s8 c0 A; B# @4 W, ^* N# L
LDY #$00" x( N. J( o0 U$ A5 g6 w9 g! L6 b, q
button_cmp:
" z4 |" [) j- D4 K- {6 }) ` LDA button,X) D B& N9 S" P7 d
CMP ora_data,Y
1 N2 `1 X* j/ X BNE count_Y_cmp! }6 @ X* z; U/ V$ s5 t1 c
flag_cmp:
' l. K: H, Y$ s% O9 H* H LDA flag,X4 `6 Z6 w; O7 M' V* v
AND ora_data,Y
' s9 {9 ^/ ^! ]; w# @1 y BNE flag_and
1 e7 u" S! {6 Yflag_ora:
- I- m) R" c7 n LDA flag,X
) h3 r7 m" ], ?; f3 t6 _' R/ Z ORA ora_data,Y
8 l3 a4 }# j- g STA flag,X
- a$ E3 i. f; S0 y" A BNE count_Y_cmp
H8 z5 p! b3 o1 }5 j- e; Lflag_and:. [' ]. I4 M& x* S* I
LDA flag,X
+ T7 J9 N. U! h* s$ ] AND and_data,Y
6 t. ]0 _; @9 J STA flag,X& Q4 q4 n2 D6 n( |( ~3 j& g
count_Y_cmp:! v% z. M% }, I. J+ a T8 Q" [- A6 s
INY
: @1 N7 d8 p5 U; m" Y Z3 e CPY #$087 N6 F- z1 [! P+ `& P* @6 {) a
BCC button_cmp
/ a/ W# P2 D- n. g2 Z7 U X
, J I, t+ i8 K$ Gdata_extract: ;数据恢复
. e( t: X9 N; `8 i PLA6 C/ w+ Z( R% H6 b; m5 O( G
TAY; m7 h0 U# R; F
PLA
/ f, ]9 m6 \+ {0 r3 _ TAX: X; E+ f1 n' j+ z. g {
PLA
/ T/ _' o" \) P; p8 f. ^6 V
: l9 }& r6 ?. n" [. H% {return:8 i7 n7 x; \: f; N5 y* c
RTS
! Q$ f$ v# d$ N% Z& T : _3 s8 N2 B; g! w+ W
ora_data: ;按键相或数据' Y! b* ?2 j; i& L+ F
.BYTE $08,$04,$02,$01,$80,$40,$20,$101 d* l9 d, z6 C- |0 ?4 z
and_data: ;按键相与数据
# @9 \+ b2 Z' r" x& N/ g# U1 R, E .BYTE $F7,$FB,$FD,$FE,$7F,$BF,$DF,$EF
: `3 C6 z d" r/ M/ F: T! O8 C
3 b) m9 r& j+ m; w" p& _, w % O/ g2 \3 {' s' Z$ D# e; e
; U, M) m, Y1 _3 w; Y* ]* @, ~ ;FC数据搬移程序 BY FlameCyclone9 ~" [4 Q. R- W7 ?! B' ~. Z6 X
.ORG $8200
/ @: X2 T4 |; M( h' k JMP DATA_COPY_PROTECT. d2 n. U# ~- o3 x- ?$ F. s
- r1 w# b4 w3 P* y, }8 w5 o1 ]ADDR_DATA_TO = $40 ;目的地址
6 t4 T3 U4 }" F }ADDR_FROM_START = $42 ;源开始地址 C+ }6 v4 I' I: `0 {2 l
ADDR_FROM_END = $44 ;源结束地址1 |5 h. D4 H4 y8 m
0 T5 B( \. J" X# [" XADDR_TO: ;目的地址
$ I0 }2 ^; d% ^% J6 a- t. ^4 Z .BYTE $00,$70
2 l. v3 T7 m4 ]! ?1 wADDR_BEGIN: ;源开始地址1 z) E5 W$ F5 I6 B$ D- p
.BYTE $00,$83
7 Q2 V1 `7 R+ r1 u. m8 EADDR_END: ;源结束地址6 ^7 j9 ~ J8 S2 g3 ?- T# V* t
.BYTE $FE,$84* V3 \+ G+ t$ L7 t
/ Z! h# b6 d0 g4 w* z$ x% U
INT_ADDR = $08 ;中断地址# o6 E% V( O) S y2 Y+ r
FLAG_OVER = $71FF ;完成标志# }1 s0 Z6 P7 x, ]; Z7 K* r
2 O, h7 E l3 g2 s* Z2 R8 {# V @* C+ V$ w/ p
DATA_COPY_PROTECT: ;保护数据
3 @, G9 `& {/ i! d* U; ` PHP
7 z/ ~3 U- F% K& K7 I/ J5 f PHA& l0 N# D! Y- s- y
TXA
* i# \, \6 i4 W8 k4 a- R PHA$ k& x2 R; C/ s5 U' n* ~
TYA
4 ?( d% \, C8 Q: d PHA
6 l3 c4 b# S9 L2 L* Z: q% b- B# @# i LDA ADDR_DATA_TO
- f( w: D1 ]3 f PHA8 S# v6 ]' v" @
LDA ADDR_DATA_TO+1
) y0 J. Z% c* N9 Y PHA
# Q- B( L" X. m" M- `& Q LDA ADDR_FROM_START
7 S2 x! ?* X# c E2 _/ a PHA; ^+ ^6 X7 H2 O$ q' A: ^. L$ N- I
LDA ADDR_FROM_START+1$ q% y8 G% Y2 P
PHA/ }9 F- J* J* c9 l% \
LDA ADDR_FROM_END( ]& U A7 O0 ~0 d
PHA
" A& Z" s' ?6 a2 ` LDA ADDR_FROM_END+1
) H/ s. x( F1 {: L PHA2 p+ f; k6 O8 L0 A$ F
0 Q0 v& f [0 A$ c- kOFF_INT: ;屏蔽中断
: \( S" B, N" e& f2 N% W LDA INT_ADDR7 X8 `2 r3 Z/ ~ q; H
AND #$7F
4 j# y5 Y# C; _6 l- _" u STA $2000 ;屏蔽中断0 \5 z; y1 `5 q9 {) W6 W2 V2 _
- y4 t7 i6 R( }! s, }7 u) C
6 E2 \, D) d6 W! FSET_DATA_ADDR_START: ;设置复制起始地址" n! E( T" X$ g' W& F
LDA ADDR_BEGIN* Y8 x. D$ o8 s) i4 K5 N9 V
STA ADDR_FROM_START ;设置复制起始地址低位3 x J5 B9 C) B5 ~" k
LDA ADDR_BEGIN+1
u4 e# Y/ [# q+ L* E" N STA ADDR_FROM_START+1 ;设置复制起始地址高位 I- s: a5 Q Q7 l0 n) G0 ^
6 d8 r/ K* D% W! CSET_DATA_ADDR_END: ;设置复制结束地址( H7 a" Y6 m, d. G9 l( F/ ~ Z
LDA ADDR_END% N" E3 P1 ?2 l9 F- o
STA ADDR_FROM_END ;设置复制结束地址低位1 z, r; c; t0 L) y3 R" Z- S
LDA ADDR_END+1
" S1 c, U# i1 x! y2 M2 c4 C3 S STA ADDR_FROM_END+1 ;设置复制结束地址高位( C2 W& q1 Z0 n& e+ k! i( o$ @- n
6 ~: n. X6 v. I; G' ^! Y
SET_DATA_COPY_START: ;设置目的起始地址+ t7 h6 ^6 | k& i+ K U5 _
LDA ADDR_TO" V. g+ W7 f) s7 y3 I
STA ADDR_DATA_TO ;设置目的起始地址低位. s0 u$ u( e7 f5 x5 k
LDA ADDR_TO+1
' Q8 k5 q) o. L, i/ S- ~/ D, D STA ADDR_DATA_TO+1 ;设置目的起始地址高位
& s7 v3 V* }* M6 Q: d; |! ? ) L& H L1 S0 N- C/ p
OVER_COPY_CMP: ;复制完成比较$ t: g: ]' n+ m R8 @0 P& p
LDA FLAG_OVER; F1 S" X; y/ o, r7 P
CMP #$FE ;复制完成标志比较" ^0 K. y# v* Y% Y2 ]
BEQ DATA_COPY_EXACT
' N$ @8 d, s& ?$ A5 M6 f
( M; \+ ]* x( B( `' B% u+ CINI_XY_COUNT: ;计数器初始化
5 [7 u0 d0 a! j( ~1 T) F LDX #$00
! \) X( D9 m# }; u2 Q LDY #$003 O( [* M; h- |0 D* ~
( u# R' ~5 l3 e0 m8 hCOPY_OVER_CMP: ;地址比较
M. u& X# t! g x" ` LDA ADDR_FROM_START
4 z! k( `7 T( [ CMP ADDR_FROM_END: c G# {/ i" ~2 Q7 _2 ~. b- i
BNE COPY_START
7 n6 E2 U) h1 v LDA ADDR_FROM_START+1
9 G. N1 z; e+ g( ]* N+ b) z CMP ADDR_FROM_END+10 p) o: x6 }; n& H; k! ~! p
BEQ COPY_OVER
7 V- y1 x6 j* {5 N
4 w1 y( G8 C' F1 B- ACOPY_START: ;数据复制开始
8 m: o3 T3 U# @6 l# r+ z LDA (ADDR_FROM_START),Y ;读取源地址7 L9 D& S" K+ X0 L1 o- X( u
STA (ADDR_DATA_TO),Y ;写入目的地址
. U# k# K+ p* i INC ADDR_FROM_START ;源地址低位递增6 O" Z3 L9 ^) W! L* Z
INC ADDR_DATA_TO ;目的地址低位递增7 S: F* Q9 N# O- h* A( L
BNE COPY_JMP* |7 w; e' W: U- p+ m
INC ADDR_FROM_START+1 ;源地址高位递增
8 v. f% H7 E# O: ^$ ^7 S INC ADDR_DATA_TO+1 ;目的地址高位递增* g& N2 H- W- ^) A/ X2 U% B
- V# @7 ^/ P! Z
COPY_JMP:
/ _8 M( u' M; T0 L' } JMP COPY_OVER_CMP7 @# a3 ]+ |% a) m; ]
8 J/ s, [' [* N0 i: i* w3 a
COPY_OVER: ;复制完成
5 P+ R1 T1 I6 h5 E1 a/ d LDA #$FE) @. M6 l& e& |8 x8 R; o
STA FLAG_OVER ;写入完成标志. q9 e/ ~( a Q0 P# X9 ]. H1 T4 N: T
FINAL_BYTE:' [- V: L) z7 i; j) B5 g8 j
LDA (ADDR_FROM_START),Y ;读取最后一个字节4 f" J% w6 v/ {: w0 L2 s
STA (ADDR_DATA_TO),Y ;写入最后一个字节
' @& F; h! h! \1 h' k& d" N9 R
- n( O5 j! C4 E3 `( \3 K W# ^5 |* tDATA_COPY_EXACT: ;恢复数据
7 e) P% X g" \0 z LDA INT_ADDR
/ u, c/ A6 F. Y7 L* i2 B STA $2000 ;恢复中断. q! x& d- V) P% J$ Q, K
PLA) X5 I, S( W6 ?2 w) I$ z
STA ADDR_FROM_END+1
; G* p$ M4 d. m/ k2 j! `2 _ PLA7 i! z& u, _' j( k
STA ADDR_FROM_END" U) a/ m$ P7 m, ]7 b5 ^" q4 D" t
PLA+ z( n: O5 w1 T5 [0 N
STA ADDR_FROM_START+1$ I+ m! h \7 M( U' C7 Q9 N6 b! h
PLA
0 K* P- O' q" L$ | STA ADDR_FROM_START
) d+ Y3 q5 a. }1 ~5 g% a PLA
* U- Y# r4 ~6 t, `: j. _6 O STA ADDR_DATA_TO+1 p, ^) G9 \$ i- d
PLA' E! I t- H7 E9 y
STA ADDR_DATA_TO9 g) o& v8 i' U" c
PLA+ T j' B/ l( D C4 o3 ^
TAY) E# z5 h8 C% S2 X! z$ H
PLA) D% k3 e* }) A, n
TAX' {, F t/ d( ]+ q( J/ a" i
PLA! ~& v( A5 e! }4 N q
PLP
8 F o' W7 Y) a) D) K% g
. r+ t' v! j2 L4 C3 T: {
8 t2 U* `* e8 F2 {/ a 8 f, H- L7 Z3 d' @4 C3 n, [
DATA_COPY_RETURN:+ w- V- m: s8 V) z
RTS @5 p9 C. e# q. |' Q9 H7 b
+ ~/ Q, h' ]# S! J/ V) Y .ORG $C056 ;精灵指令覆盖
9 l7 f# {0 d# O* ^0 [5 C JSR $FFB58 P2 O: d2 k$ g% |* F/ g# J, K
( R) s3 y5 U/ @/ s$ V% K. b
.ORG $FFB5 ;
* A& C$ v: h$ _9 { PHA
4 i" G. p. g( G TXA6 z* y1 B; c) e- [! K
PHA
( @" A! z! {2 [( p0 r TYA" n6 Y# D9 B4 H3 G- q; j
PHA# G' Y# d( s, r: Q1 w+ k: D
LDA $71FF ;比较7000-71FE数据是否完成复制6 O3 x2 s4 l @4 l1 |
CMP #$FE" o5 i) s& B9 F
BNE ADDR_FFCA1 P. \! j; g+ P
PLA G! X+ d1 h: r( u5 X
TAY" G/ e# I# s! N. Z: J2 _( \
PLA# ~: d+ w4 I! u2 o0 Q8 S
TAX5 \0 N i6 {2 t& I |
PLA" I& B7 A( h2 d
JSR $7000 ;跳转到自写程序
7 b0 r' M. ?0 T2 b' x$ @/ E RTS
9 k+ O) r# ]! B( tADDR_FFCA:
$ ?- T& f. n/ z! w; d% I/ b PLA8 I' a a& R+ w5 I8 Z( K3 U9 x. X
TAY! y# M* S5 H# ~6 y7 p
PLA! c$ e/ u2 ^# l' |5 ]
TAX
. j& w9 T$ d! a3 P" D) n7 i4 b4 u( e PLA
- k7 F4 e1 i: ?6 o, f+ O RTS2 r5 F7 M0 p; ~6 y: G0 m: n
' G) c/ v( q, q$ V3 Z# o, s! Z+ P! S9 y. B
) C! q% M2 `; P' I3 \
.ORG $C264 ;自定义的MAPPER2切页程序
2 e+ y0 a) w+ G6 J5 z PHA
! L& W& j4 d8 s5 A5 `+ ^0 ~5 W0 [ TXA
t& s8 f( H( U7 ] PHA, Q, \% z2 B" b7 u
LDA $0066
* ?! x0 @; d' d$ F- O5 w2 j BNE ADDRC2800 T' y# d7 W. {; ~4 A
LDA #$074 z. S& g: E2 Z) W S4 _6 a
LDX #$03# l+ } o; J6 z
JSR $CD9B ;自带的切bank方法9 k0 S: T- c& ] w6 e
PLA
: X* X; V. a2 O9 P. S1 P* d D TAX
" Z2 o/ u7 D6 A9 |6 c8 J& x! [ PLA ?: ~# \# S8 Q- N$ v: s1 s# G
JSR $8000
. n; e; g0 }$ Q+ `. {7 `9 \ LDA #$06" Z: ]+ M0 t* q4 y
LDX #$031 p, z8 X) C0 l* s
JSR $CD9B ;切回原该切得bank(可以不用)" d5 F; u @. w& e% r0 W
RTS8 l9 }2 o6 S- q7 R8 J
ADDRC280:6 ?" j. h$ l0 y$ R; l) Z! h' Z: b# H
PLA: \& i# a+ f. u8 y
TAX
- X8 F1 H. o0 j% T5 |4 Y3 e PLA0 V3 s1 e9 c: C- l
RTS. s2 Z* S; o9 ^6 D
( N! P& M' }' g1 K# r9 D8 {
8 h4 }) U8 O' A;[FC][最终任务PPU][END]. O* R) s1 u. l# |) t2 Y
.ORG $C056 ;跳转到PPU重写程序8 m0 o9 f! b: J7 ?3 U
JSR $7000
, r# m3 Q! y% U5 G- L' X, o
! o9 \( q1 I6 J2 Y+ u z9 e5 B .ORG $CEBF
1 x1 G* q, K9 _% ] T5 h2 w s JSR STAGE_DATA_WRITE ;跳转到关卡数据写入, P& ]3 [0 Y+ I* R, v% H
& L5 j0 X* P" F* x w
.ORG $E460, s: f& i- W" S$ D# _
JSR BULLET_DATA_WRITE ;跳转到副武器数据写入" q- _$ M3 ?+ t9 r4 x0 n
# l0 g) {' ^! z, B- @ .ORG $71F03 S" A0 R5 e4 V
STAGE_DATA_WRITE:
, U: `: ]% d* H% ? LDA $6010; M, s% C( |3 I1 s* n
STA $1E ;关卡写入
: U, `# b. e% ^3 T/ _ LDA #$00
2 {5 H' t+ v$ ^$ y RTS
& d& x: \; `9 W/ P. }1 Y, W) y- K* _% q .ORG $71C0* R1 i( `4 w: e3 W# b4 h
BULLET_DATA_WRITE: ;副武器数据写入
; B) J: @# ~9 r CPX #$0E
! p' H2 a1 F$ u0 P8 E$ \4 k BCS P2_BUL
, V8 N" k4 C. fP1_BUL:
/ \3 @% o' F: I7 @. z LDA $6004" ?2 w* P; V1 i, r1 O$ A$ B
JSR $D7D0 ;P1副武器数据写入
" ]1 M$ k5 @3 S( \0 Q% o RTS
$ _- y* X) X- z* yP2_BUL:( N6 m( `; |5 z8 i
LDA $6005
# |6 K! E" @5 g: D( x JSR $D7D0 ;P2副武器数据写入
9 z/ z7 E, k: n8 M RTS
1 h' V1 z/ F- Z2 [2 B
1 s+ e O8 G2 u' m
, a* k: }( {, U3 ? .ORG $70005 ~9 k. I: k2 D) ]% ~
7 N* u7 a: u6 }9 ^
STY $4014 ;补上覆盖的精灵写入指令
+ y) L8 T% W8 G% L PHA4 @! {, N2 z% b, T( r& A6 f5 O
TXA6 ~" b9 X, Z E5 D
PHA5 _/ L8 U# A3 V
TYA7 Y7 m7 R1 a7 b' E1 Y3 F4 x
PHA
4 A: G U; I6 z5 o9 R% _& e LDA $0C
3 C8 r& q, ]0 q5 z! K: P CMP #$01 ;比较是否为标题画面
$ T4 N, S/ r! J- G BEQ PPU_STAGE
7 w5 g& {( \: f& y PLA" Y3 j7 v; V5 b9 b' T+ o; a. p
TAY, Z, `" v! h. u: Y. e( A
PLA2 E& s$ _) ~: ]
TAX/ F3 w9 G9 _/ A& s; ~
PLA" z7 M0 i8 g: f) g5 E6 {
RTS
/ R. F5 N6 x& g. o- s5 lPPU_STAGE: ;STAGE显示程序 e7 Z! m9 v. t8 c8 z' C
LDA PPU_ADDR_DATA2 n5 Y4 i4 X3 G" ]
STA $2006
$ E5 ^2 F& x0 ]! t LDA PPU_ADDR_DATA+1' M C+ O5 v7 l) l
STA $2006 ;坐标设置: V2 o3 c( ^# f2 ~' t/ I/ i7 X3 b
LDX #$00
9 x* \6 G2 e P& X8 _& qPPU_STAGE_WROTE: ;写入STAGE字模
2 j8 z/ q2 Y5 k1 ?( f LDA STAGE_DATA,X
) K7 X7 N1 Q. b+ K9 a0 L STA $2007: D) s% j; J2 I/ n) x0 ^; w& o( E
INX
3 r& g& q; m; `1 p" p; T CPX #$06. y6 J- c) [2 o+ Q
BCC PPU_STAGE_WROTE
0 k9 l2 u8 E1 Y7 y' A7 z( X LDA $6010) R( K: a( E" b. @
CMP #$FF ;关卡数据初始化条件判断) n( D5 o8 X* x. M- Q( H
BNE KEY_B
% G& W0 d4 h4 m% M# p$ E LDA #$00
4 {+ [1 k* q% Q L STA $6010 ;关卡数据初始化3 p5 L* d9 x+ \ M& L7 j6 C+ L
KEY_B: ;关卡减少$ i2 V' o+ l3 |! I- o( h- [2 N
LDA $04
% ?; G2 ?/ t& X- a. }9 ` y AND #$42 ;按键B或左减关
; r# b- r6 l& i: O8 N7 o BEQ KEY_A# b5 i4 V& A( L: _
LDA $6010
8 R) W# b% {7 w% I; k! Q CMP #$00 ;关卡比较
6 a/ j2 h! _3 r) S( P BEQ KEY_A% Q* m1 s+ o" Y( _9 H
DEC $6010 ;减关
. u7 B' {: D+ ~1 AKEY_A: ;关卡增加" _0 n5 h( v9 J/ ?# y9 \: h. X
LDA $04
. A* O' ]/ l- }0 ] AND #$81 ;按键A或右加关
j2 |$ a3 Z/ I* b6 r BEQ PPU_NUM_WRITE
/ W7 h9 A3 J8 L. k LDA $60101 J( e6 U* o7 y2 P$ k
CMP #$04 ;关卡比较
! x2 e7 u+ n4 E( C9 x7 d' c; { BEQ PPU_NUM_WRITE( ]& B- n0 M6 V T
INC $6010 ;加关
! i+ E" ]- O, T% B6 t# b' a q, aPPU_NUM_WRITE:
. I3 P: B, h1 Z# \* ~ LDA $6010; s" m: Y7 |: r; R l, H
TAX
3 o! l* R. C* z' x( W LDA STAGE_NUM,X ;写入数字- i2 A9 \, _: b
STA $2007
]' k# i P5 g6 `PPU_RTS:6 z# V5 ?7 B3 Y; T0 h: g
PLA7 n1 G7 Y k1 c
TAY6 Q) M/ c9 F Y9 V9 U
PLA! a* ^ A% L/ H! Y
TAX
7 e8 w/ i' g+ E p PLA6 W$ A; e: A6 v8 M
RTS' G n$ j# h; n3 g
2 r- I: y) S, i
7 [# v5 _6 t9 j; e4 K% H4 W2 y& ?2 oSTAGE_DATA: ;关卡文字S,T,A,G,E,字模数据
7 c. J# Y, Y( A% y% r .BYTE $EC,$ED,$DA,$E0,$DE,00% {( g4 c) i" `: ^% V; t
STAGE_NUM: ;关卡数字1,2,3,4,5字模数据
+ b3 _0 V% T0 u2 y. \+ `! T. x .BYTE $D1,$D2,$D3,$D4,$D57 F: @' ~+ c" |: [0 w
9 P; @7 j9 ^9 t1 K; e( K5 oPPU_ADDR_DATA:0 q, s* c1 \, ^- R
.BYTE $23,$0C2 E5 V. W/ |3 b; r- h4 W H
* G. s8 a3 }5 f! P6 T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|