|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下3 h! v+ A: g& ?0 h4 V0 w
* D* r8 j9 J" R
以下是主框架代码:. d7 ~1 x# a- ]
- ;======================================================================
- H& o/ i" R! y' K - ;文件头6 N9 }6 z/ ~ m) y% I4 @: X
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
( f0 T( e( B$ g" s$ g' y/ }" k- f - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量4 W `2 ~5 x, x. G( I
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
/ d6 [* H0 C1 z/ a% }) b - ;======================================================================- A7 p4 y5 \/ s# I% ^+ ^! i
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
" g; Y [6 q0 f: s+ e; S# ^ - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
" P6 X! @) A q% O, K6 |3 t+ { - ;======================================================================# A* w% i9 \/ P- S1 v; g
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1# J5 D3 u' y1 }& S) S2 L
- RESET_ADDR = $E000 ;主程序起始地址
) o o* W) D3 y; d. w1 x9 E - ;======================================================================5 Y6 e, x' `+ P/ K6 Z
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB- I: R; x1 G( ^3 f0 p4 K! |
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
8 R$ d: f3 y3 B - .INESMAP 4 ;Mapper号 (0-4095); d$ j7 N8 Q* _$ u4 a# ]' C
- .INESSUBMAP 0 ;子Mapper号 (0-15)) F/ I- x- c8 v% ?+ r$ U: t
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
/ ]" L# x, f- p4 S$ t - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
6 {, s; P4 z1 H1 h: s- t- h - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)1 e, u6 F: e, L M/ Z9 ?8 ~% V
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
z+ t! Q+ B$ P* x - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
% K& T8 U4 L7 F# W$ [; M g* g! D - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)! f' H, k( h: G
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
$ |! z$ ^' Z1 z3 h - ;======================================================================: G9 R4 F0 h' V6 N' i3 B9 @& t
- .INCLUDE "fc_demo_config.asm" ;全局配置
6 X" X1 ~8 k% K% _$ [+ d - .INCLUDE "fc_demo_constant.asm" ;NES常量" ? h1 \. R+ d& b8 {- D
- ;======================================================================. c$ p2 L8 m1 M
- ;音乐配置2 \& X: N/ X2 ?* o% V% o; W. y% @; G
- .IF 0 = MUSIC_THEME
! B4 w# }' d G& h& K( x: R - .INCLUDE "data/music/Gremlin 2/config.asm"
4 P, e6 A; T* v; G" N- t# { - .ENDIF' U5 \" F( x8 q/ w1 r \9 b: o
-
8 r) N& p. }( D+ p - .IF 1 = MUSIC_THEME4 v9 a$ \# y6 E( d1 ?( K$ Y
- .INCLUDE "data/music/Raf World/config.asm"3 m- I: ~+ U9 [
- .ENDIF4 l4 _, [ M; A7 T4 t1 v7 b' W2 o
- 1 K, p% P8 Q* g! g8 E
- .IF 2 = MUSIC_THEME ( K' W' U0 z: d/ H3 E
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
! ?2 {) Q+ \: B - .ENDIF5 M' u6 U h/ [) N; L
: w( U0 ?; @) J+ Z7 c- ;======================================================================5 Y8 X* `- W: C" c9 c" h
- ;引用CHR图像数据
. C0 F" m$ r9 S; e/ A% B2 q9 C7 @8 Z - .BANK NES_16KB_PRG_SIZE * 2
9 s5 L* i' s1 T1 P$ i - .ORG $0000
- o5 a7 Q4 b; d+ Y, L - .INCBIN "data/bkg.chr"; Z+ r4 o" `+ E6 T: h1 E2 x
- .INCBIN "data/sp.chr" l5 b$ b7 L$ n
-
P O* L$ P* r; O5 \, S! E - ;======================================================================& ]) y, q4 N( n6 J, h z
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
* Y& ]1 ?0 X% ]0 T% a5 W" I - .ORG RESET_ADDR
( c/ i, N/ x# h4 c. o - ;======================================================================
) F+ V; P& X' R. N B - ;引用其他源文件' x8 W' ], T9 P; s( o: v' V
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
7 }+ e" q& `# `8 L& _9 l - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理: N0 W2 ]$ Q) C- v( |; i
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
9 g W( i. \3 J7 E" z - ;======================================================================# r, k1 L# d" A, j: @- g2 P' C
! p: g+ @8 }) c- ;======================================================================$ R$ n* u6 ^5 X4 l6 l* V; ~" `
- ;等待VBlank到来
. E7 o) F5 B" I - Wait_For_VBlank
6 s0 h9 b7 E! [, N. ?- s - LDA PPU_STATUS: K. T m9 W9 f: {6 s0 d
- BPL Wait_For_VBlank) m2 Y- v$ `4 S- h2 g# _' A7 [& \2 q
- RTS- X; D5 e, j4 o1 L2 L! M! e
- / i( ^! r; f) h
- ;======================================================================/ |& n1 ` s( R/ o) X5 c! A" w
- ;调色板初始化2 U9 a! J. f1 ^' F' E8 Q& Y
- Palette_Init4 I+ o4 z( t: o V' a( H4 U* ~- ]
- LDA #$3F
8 D' U9 A: X8 ^# q0 b - STA PPU_ADDRESS
. {, L; h( C0 b( y - LDA #$00
' O; d! T9 \7 s# Y( C2 e; e1 L/ ]6 w - STA PPU_ADDRESS
9 ^& z* r1 v3 o/ v; s - LDX #$00
, T/ d/ k6 N- T$ Z$ u! P - LDY #$20+ A( a% h* x% y- M- `
- .Write_Data- M* V- p6 K' v; D+ z+ i }
- LDA Palette_Data,X
9 d7 |* z: @+ Y0 { - STA FC_PPU_Pal_Addr,X
9 R4 a" a$ d. ~6 Q- u& f - INX
2 U/ q- [* ~" A* x6 e; H; M - DEY' ?# r' F M' q7 u
- BNE .Write_Data
+ E) m) L/ y8 `- @8 G8 `3 z- x - .End/ a5 q9 D' c2 ~3 Y9 J
- RTS; B+ ~4 c1 A* j8 n
- , u% ]2 c; I0 @
- ;----------------------------------------
# @# g3 m) v0 a, H - ;调色板数据
8 X* w4 w q! r5 b& q - Palette_Data! S0 }' a7 T: b# U
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B, Y7 A7 W" Z; q. Y+ F
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
\" t; U& P, Y7 I* D - 8 Y" ^9 c- K3 s1 e* w. [$ B! @
- ;======================================================================
3 w; @& P, K. o, m - ;命名表清空: |5 n/ p6 l) F# Z
- Nametable_Clear
7 _! k% K* l( X" j# n - LDA #$20$ |8 ~" o! a8 `) @5 h( w
- STA PPU_ADDRESS
' O; U1 _) w# h9 H Q6 F j - LDA #$00
* q! O' K6 `. k - STA PPU_ADDRESS! ~, M6 W) W3 u. R6 h$ b3 t
- LDA #$00) e3 s- u! \( a$ s: Q$ r% J
- LDX #$00
1 \( C1 W/ |$ a% V: _- S - LDY #$08
3 ?7 r( h6 ]4 O$ a( Y - .Write_Data& P& }8 ^3 {2 l6 \' s
- STA PPU_DATA
0 M1 _- e$ B2 z; Y0 B - INX( W& ]. a$ w8 X- A( }
- BNE .Write_Data
/ R, v1 ^/ g, h: m q- s - DEY
. w2 T9 ^0 w- A - BNE .Write_Data$ _! U3 I, ?( C
- .End# ^8 T; R" |& S9 ~: {
- RTS5 ~0 l! @5 J$ K; _% c0 ]; ]# M3 O
7 A' v7 Y( _/ a- ;======================================================================
0 @; J( N- E- Z# E% b - ;音乐曲目切换
0 t6 `+ s3 Y. a7 {' C) S- w& M - Music_Select_Process
- l; A( p0 l8 Q# m - . V, H+ K: J9 |; q
- .Pre_Music;上一曲, ~: v$ @9 P$ p4 G! ~, A
- LDA FC_Gamepad_Once: M1 K N# T( _6 \' i
- CMP #JOY_KEY_LEFT
- C1 g; u, x# Q' K L& y3 C$ f) c - BNE .Next_Music
( `1 M W& X8 [' a- u, v4 e. i# i - JSR Music_Play_Pre. p$ |" K, L" b0 c; }- U, M
- .Next_Music;下一曲
" [' I, Z Y- X; x! ]+ j - LDA FC_Gamepad_Once
, ]& D- e9 [! N' b5 T - CMP #JOY_KEY_RIGHT
1 p9 p+ `/ A1 G - BNE .Next_10_Music
; D, q( K# V1 |. ]6 [& K8 x; u6 Y - JSR Music_Play_Next
$ X! j6 S& | v" p3 I9 J - .Next_10_Music;上10曲
' e% C' i8 D6 m - LDA FC_Gamepad_Once4 l8 Y4 c+ m' d6 C* n
- CMP #JOY_KEY_UP
5 Q: o! b. ~4 M* U& t& @7 v- D- q - BNE .Pre_10_Music' b$ }7 m) [' t) X/ f
- JSR Music_Play_Next_10
5 c2 b* f# ^* B( G( X - .Pre_10_Music;下10曲
: |) ]6 r! a' |6 i# [6 Y1 } - LDA FC_Gamepad_Once
* F0 z3 e9 U7 u' ^3 F+ o - CMP #JOY_KEY_DOWN
1 `# a$ Z: a2 {/ q4 d - BNE .Reset
- y8 C8 {1 N6 n2 F% b - JSR Music_Play_Pre_10
( q' c5 G2 I q T8 a6 u% G - .Reset;重播当前曲目; F( [; j( W( m5 f" C9 v
- LDA FC_Gamepad_Once' b. o; a, Y* a* |( Z0 t" g
- CMP #JOY_KEY_START
; ^! l& o4 q* l. A, E; s2 K - BNE .End
* \6 q$ ]1 C7 {' T: F5 x - LDA FC_Music_Index( S/ w, m, f& l3 h
- JSR Music_Init_Process2 \1 x- z0 n/ S, p
- .End
; W9 P" m3 d2 ?5 v* R' F - RTS
: Q" x4 P7 p0 U% l/ ~
+ a8 l8 T' ^3 |4 _. e! x- ;----------------------------------------------------------------------
, f3 Z( w* G1 o0 w- H* @- ^ - ;播放上一曲
0 b0 }, j I* J - Music_Play_Pre6 u* N1 r& w8 T+ C- q7 U5 M
- LDA FC_Music_Index
( q2 m0 N; y' _ - BEQ .End
6 j% k- f: @" y6 w - DEC FC_Music_Index
/ W5 ?: [: R4 f1 ^ - LDA FC_Music_Index
# W- z: w0 o7 _2 f; R! m - JSR Music_Init_Process: U4 x4 ~2 g" [
- .End
% ]' @* y& @# J - RTS( l. D- Z2 B' b. X
- ;----------------------------------------------------------------------
7 b2 N! i1 G1 }; g9 H) t - ;播放下一曲
4 @+ f a O, d0 P: N5 ? - Music_Play_Next( @+ o. V$ r4 ^+ ^
- LDA FC_Music_Index1 X2 ]9 u1 v: U2 F
- CMP FC_Music_Max_Index: y+ R) K p( S- O
- BCS .End
+ y) `# e+ I$ I, R, S+ Q9 ^6 A% J6 A( J - INC FC_Music_Index
! ?( h1 G5 j9 V$ \' b; J - LDA FC_Music_Index2 E! ^2 p. s9 s5 ^; n$ @% K
- JSR Music_Init_Process9 D9 f; b. z- ?( F) K6 z* e0 [
- .End
N* b7 B: {; P2 n0 \ - RTS
3 \( D5 i7 ^3 n; ?) r. S: A* j - - Z$ O" |& H/ Q9 h8 C* `
- ;----------------------------------------------------------------------; }7 F1 r; E. c% z0 i" |& M& n* @
- ;播放上10曲
' I. n: N2 h; c9 i5 Y - Music_Play_Pre_10! b3 e) b6 H; w9 D( b
- LDA FC_Music_Index
9 {( V1 t9 T: g0 z% i8 P - BEQ .End7 d$ k7 x2 U' k) v ?" T- i
- SEC
$ d! a* L ?8 g6 i& \2 X4 Q' f8 C - SBC #10$ v( d) e1 T* O" @& E+ Q
- BCS .Pre_10( p3 Q: |1 y% F" ~" W. K
- LDA #$00
I Z: D1 N- A5 `# [5 K - .Pre_10
6 O# k' [: w4 C' q, O5 Q6 `+ c - STA FC_Music_Index& J% F$ V2 J% J- f) G$ j9 d) z
- JSR Music_Init_Process6 } c# m1 P) L( y0 n
- .End3 w# t; V& G/ O8 o
- RTS7 D) _) Y4 ~1 Q5 D9 [
- ;----------------------------------------------------------------------6 n2 b- x6 a+ E8 O/ F. u5 _& C
- ;播放下10曲# g7 ]! i7 S, C; O
- Music_Play_Next_10) P- }- |6 i5 w- |
- LDA FC_Music_Index
( y% O" R! P7 f, T1 {, e/ E$ h - CMP FC_Music_Max_Index
) ]+ q; K2 p6 |" s+ k3 f$ g2 ^ - BCS .End
3 Z8 J. J( h. O% {7 w - CLC
* q6 x. F/ O7 A' e% R - ADC #10
( M7 ~7 k6 [# i( W8 y8 H - CMP FC_Music_Max_Index
! `7 q9 F8 v' m. n - BCC .Next_10' [* t0 T+ c! _; V: j# \# ^1 F( V
- LDA FC_Music_Max_Index
0 m% \/ o3 a0 q1 R- E1 c: R/ m - .Next_10
6 b H- W8 u7 O( z7 J3 l$ i - STA FC_Music_Index
. Y& \' y: @& O - JSR Music_Init_Process0 @6 a+ [: n! z f. E! i
- .End" X% k' w% `0 O) X9 @
- RTS
' e3 v8 g( g: w/ e1 v9 p. { - 9 S3 h7 Z; R1 i3 E
- ;----------------------------------------------------------------------1 R0 t3 K8 G/ Y: x
- ;8位十六进制转3位十进制制& T6 `4 D; k) L |4 P3 T
- Hex8ToDec
* W1 m/ `5 D- O - STA FC_Dec_Data_1
# @' B+ h3 @5 n! f+ M - LDA #$00
3 M) L9 w) M1 y: B6 K, z( T" Q - STA FC_Dec_Data_100
: @- [" F' x( K8 t( g; U# ` - STA FC_Dec_Data_10
- y' k& ~4 S9 K" \2 ` - LDA FC_Dec_Data_1
9 p$ q: T' P7 u, l - .Convert_100
& `! g# [7 L8 m) }* K8 C5 z - CMP #100
* R k1 l R+ S l5 t5 r - BCC .Convert_10: h' G! Y. n8 ]! L
- SEC
L6 g- H! L0 s4 q - SBC #1009 x/ y# ]2 A7 w. p" Y: y% v
- INC FC_Dec_Data_1009 l2 _) P, R. I' i2 g' b
- BNE .Convert_100
5 C+ e# s4 f% J) A( z) @1 v - .Convert_10
! X, A0 @ z0 c( l& N - CMP #10
0 s! L' ^8 z7 J4 D; a - BCC .End& g4 h+ U% M5 e# J$ \
- SEC- {2 K* ], D4 W+ L; H' u
- SBC #10
) F# X3 E2 }( e, H8 @8 N5 Q - INC FC_Dec_Data_10
- c ]! g8 \$ P - BNE .Convert_10
+ T2 h r" B- b9 g& G- { - .End$ [: ^6 `8 t" w
- STA FC_Dec_Data_1
- r7 A7 ^: b4 ^# q: } - RTS/ K# N' z+ p" E: b: \7 L9 L f2 m
- ! s; }1 E: w4 Z" R8 l, e
- ;----------------------------------------------------------------------8 F# g1 Y. A2 k u# T8 ^
- ;显示曲目信息- m, W. l* A5 B% P4 N
- Music_Info_Display
" P6 i- `, R. C4 e# H2 } - LDX FC_PPU_Buf_Count
) T7 ~ s% U- D2 Y" Z9 i - LDA #PPU_WRITE_MODE_CNT_LINE
$ T; _* x$ D6 }; | - STA Use_PPU_Buffer,X
7 A9 O7 U6 U6 j - INX$ |& L, S- [5 K0 {4 N8 J& Y6 T
-
% f7 w% C3 v* n( ~" M, Q' V+ R) J( B/ L - LDA #>MUSIC_INFO_POS" x0 l% [8 g5 h. ]
- STA Use_PPU_Buffer,X8 @* Q0 t4 j! S: ?0 C
- INX4 {. o. |5 y% b8 b1 }( `$ T
-
, r, Y# e# Z* X& L( r/ s8 M. ~! h - ;居中* B- o. o- g: ?6 v7 K p
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/26 ^0 u3 _6 b/ y7 G) D p/ y6 X
- STA Use_PPU_Buffer,X2 g( [# R/ A* W6 r5 g) V
- INX4 l6 n( j2 X6 U1 s
-
- I9 a, {$ g7 ?% z( o1 H f: z - LDA #$05
, p! U' \' ]7 [+ l! E1 Y$ W - STA Use_PPU_Buffer,X
$ `& I1 W$ _$ d5 A - INX
6 E+ E. U6 E' f" {( N/ c - ) D8 V. T1 s8 l- E
- LDA FC_Music_Index6 q# l: @% |- M1 e
- CLC
9 B9 J% i' j4 ?' m1 B) F7 X% o - ADC #$01* a2 N4 _; ] r& m" l }5 P
- JSR Hex8ToDec
" n* w! l' S- d) k -
2 N# Q6 ~ U( A S" y - LDA FC_Dec_Data_10
( t( c2 m0 z+ S" H8 o - CLC& ` h0 \! C) Q" s2 a. H
- ADC #'0'. N3 |3 B) a9 A5 F
- STA Use_PPU_Buffer,X4 p% P$ W9 d7 M, C
- INX
, q" |. w9 ~, x$ u- u - 5 ~% a, O# F* v$ t7 H. [
- LDA FC_Dec_Data_19 h9 `* F8 ]0 C7 U9 D9 e; N
- CLC
0 Y) ~' q+ B3 d( Z - ADC #'0'4 Y @+ K( a) ~- B8 @9 g
- STA Use_PPU_Buffer,X
: {4 l c& u) Y/ H1 h1 x - INX
" D; @" y5 W/ L! N/ U6 | - # }$ T" h3 C$ S0 a
- LDA #'/'
2 r0 J9 ]1 @9 A& H - STA Use_PPU_Buffer,X
4 a: o& v N( i - INX6 e' i1 j/ ?2 D5 r+ r- ~$ g
- & k) U! g- g7 |
- LDA FC_Music_Max_Index
2 |7 W2 {, h7 }) ~) w+ l - CLC+ V1 E. }: z% B0 V7 Z7 [+ w* @9 c1 v
- ADC #$01" t$ T3 ~( x# v' w7 x
- JSR Hex8ToDec9 a: y# ~8 u6 F8 P: _0 P1 o6 h! i) O
- ( M+ S8 Z% \" e, n& g# D# {
- LDA FC_Dec_Data_108 F$ D# }2 g1 S& W- D# H0 z! b( d
- CLC
5 U4 w$ B r. C3 D8 S - ADC #'0'
7 [* ?4 j/ u( e E% E" ] - STA Use_PPU_Buffer,X
2 Z! l0 `: N% E$ q# j3 W - INX: ^0 A9 A1 S0 M7 ^9 ?, a
- 7 H& X7 [1 l# F; ^
- LDA FC_Dec_Data_1
/ I- b% I1 r0 D' a5 _- Y2 I - CLC4 {! }8 R4 n1 A, K/ l; `( m& \
- ADC #'0'! u& S/ q4 A- R' @( `* u
- STA Use_PPU_Buffer,X
! y j+ a, ]& V/ x) {7 q - INX
0 L! N% n, K( I- I6 \) I! }( P -
) H9 \7 i1 f& ^" f* ` - .End1 G) _7 @, U7 g0 m( h# S3 q
- STX FC_PPU_Buf_Count& t. W* D/ W, ~' H
- RTS: V8 T5 w/ X/ y; o! [8 W4 x0 g
$ Y5 c9 d0 e) C7 h9 X( c+ ?: E, ]- ;----------------------------------------------------------------------
. ?& t) {" h5 f' t% H- F. t - ;音乐曲目初始化处理
; q! @$ p1 S3 C/ a( i - Music_Init_Process2 c/ T I2 j3 \; [
- PHA
& @) @1 c; D6 A. |, ^ - JSR Music_Clear_Process
9 a i" u5 D: R - LDA #$1F
9 N; C3 v$ o: L5 L# ? - STA $40152 S8 s1 v: N+ p' Y0 j2 S$ s
- PLA1 y% B. T! h% h0 ~* W
- JSR Music_Init_Addr4 ? ]: U% O+ l# @
- JSR Music_Info_Display
q- p$ v: D1 w: E ` - RTS% K% V. ~: v0 J
# S" E5 P3 Q% b) R+ W, G* Q7 w/ P- ;----------------------------------------------------------------------9 T! b/ f& q; S' W9 w$ H7 E+ I( N& [3 a
- ;音乐播放处理
* N0 q: A( h- {* L5 D, h- c* P - Music_Play_Process1 P% P$ Z4 |6 O
- JSR Music_Play_Addr
8 Y8 w3 I2 k, k2 W8 G. D* i - RTS; Y9 z* @$ W. w. u2 H: d2 C. N
& @# o: w% I4 j( Z# o6 b ^- ;----------------------------------------------------------------------
4 p0 M$ | H7 |& X, ~4 d - ;音乐播放处理3 O( z8 ~% e8 ?0 l1 _7 Z
- Music_Clear_Process; @6 j+ R) H6 ]5 c
- .IF Music_Clear_Addr5 j: s$ f% p* u4 _% O: z
- JSR Music_Clear_Addr0 F3 v4 |( C0 B0 C, a0 e
- RTS
3 R* B2 \' K; d% J/ v - .ELSE
$ m8 m/ W3 h" K - LDA #$1F' G/ J. e% x. {' [' O& `5 j
- STA $40151 _5 |* ~. f) w0 }! a# `0 d& d6 |6 X4 }
- LDA #$00
' G- i+ U% z! H2 W - STA $4010
. A* i. a1 G+ ^ - LDX #$00
9 s. Q9 f) V" [6 C - LDA #$004 N9 x2 B* b9 C6 Y' u- [) u. I
-
5 i7 ?2 p0 U: m# G; Z7 a5 \ - .Music_Clear_Zreo_Page_0% s3 p+ X* }2 B* _& v$ U6 _6 q: q
- STA $00,X
& O! c" \ ~3 _4 z* u - INX
( _& }8 r1 a5 B - CPX #Use_Zero_Page_Begin
P6 [ w8 b1 @" n - BCC .Music_Clear_Zreo_Page_0, z8 E3 \0 n: O* b3 v
-
- d" @4 N3 K2 z6 T5 @ - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size. F% b1 h' C( U4 l
- .Music_Clear_Zreo_Page_1
: M. ^* K1 l# s/ [# C9 s0 {- h - STA $00,X, L) d* {" r4 J
- INX, _. C) p8 |9 T7 m
- BNE .Music_Clear_Zreo_Page_1" K; Q; c: A2 G& B
-
' r- M! ]7 X+ a% v1 O& @ - Music_Clear_Process_1
' v, ? @2 r8 B$ U - STA $0600,X9 j; w6 g6 Q+ | k8 |
- STA $0700,X
+ |6 b( x" q O' f$ ] - INX$ f; j2 O9 g: g x; i3 o- ^
- BNE Music_Clear_Process_1
7 B/ \$ J9 A6 Y5 V - LDA #$10, b! d9 L$ J' ~) r7 b$ C3 P2 ]
- STA $4000) R$ G. s7 [! _3 a) Y; v* e' q* l% b7 H5 V
- STA $4004
z( C4 w; U+ d0 _9 ~* v% A u4 C3 ^ - STA $400C
' i) x1 c: ]% E# V) c9 u M. ` - LDA #$00
9 a! z& x c( M; {2 O3 i+ c& A2 f" ^ - STA $4008
) Q* a; v) m* G% a - LDA #$0F1 J" ]6 J3 [& E. @, ]
- STA $4015
: E( d/ E9 v( A% ` - .ENDIF0 ]2 Z3 D5 p$ z! R; ]# c
-
5 T6 T6 B3 m0 k - RTS0 e8 S1 t% i2 S) s- u: f* }
- 4 g# S* X$ G: ?, {
- ;======================================================================
7 ]! K: }" I9 V+ ~3 J c8 p - ;重启处理
$ P- ]# _3 q, H - Reset_Program$ ]2 u4 H4 P) O1 v
- SEI- u* V: Z1 I" b2 |/ G4 p# {0 ~
- CLD% V1 K0 s5 {- n" E- M5 |% ]
- LDA #$00% C5 X% ~9 [9 C1 p% J# X p# k/ c2 M
- STA PPU_CTRL8 j3 u! }1 r7 {( y0 r/ W* G+ O$ Z
- STA PPU_MASK. ~9 j6 W* M5 d0 `: Q7 \
- STA JOY2_FRAME
+ j9 {" m- v. o2 A' o' l( N - STA APU_STATUS
% N/ L1 }3 g# Q$ M -
' ~- T5 X5 `, O; W6 Q* U& W! @ - ;等待屏幕准备完毕- S6 ?: |( F0 ^2 {
- LDX #$02
+ _5 S+ t) z; K7 F' ? - .Wait_For_Screen_Ready3 C+ L+ ]/ H3 e6 b
- LDA PPU_STATUS
1 l0 }6 w, U/ f( K- w; ~7 d - BPL .Wait_For_Screen_Ready
/ t7 U8 G% x/ N6 x; X3 v$ L* G - DEX
. B$ v7 `% _; n9 N+ L( t - BNE .Wait_For_Screen_Ready
" ]6 q8 w6 x, G' L0 b; x$ p: v -
9 f1 I/ V: S, h8 i2 w# F - ;清空调色板
+ N% q* ~& ]" l; t. ~ - Palette_Clear
9 b1 h N( T. I+ i6 C - LDA #$3F; n0 v8 o6 G' y
- STA PPU_ADDRESS
- L1 V& A1 P6 R+ L - LDA #$00, z0 o k# x+ f3 S! m- A! i$ S
- STA PPU_ADDRESS
5 G( ?6 h0 _3 I3 u3 G$ z - LDX #$20
( H/ b' V! H6 c - LDA #$0F/ \! S; C- |4 G9 `; ]
- .Write_Data
2 ]! s0 _$ f/ H; F% f - STA PPU_DATA( {' a7 L: d; w- r ^8 i3 \( Y T
- DEX
; a: ?9 p/ R* z) o - BNE .Write_Data
5 h7 o8 {7 g) k- o& a - / R' @7 n& m- p1 U6 ]" i& W
- ;清除声音 $4000-4013( @! \! _0 A! @ N8 B# @, U
- LDY #$14) f# }% f7 P6 A6 N u+ r5 S+ h
- LDX #$003 w0 T2 }1 p7 F; `9 A7 S; _+ N
- .Sound_Clear1 d6 J. Q8 O7 R" ~9 i9 k
- STA $4000,X
9 f4 E6 l; t* C# O2 r; W; c - INX2 I7 P8 T3 `+ Y. ]- C
- DEY$ V* G( s- c* ]8 i1 L" c
- BNE .Sound_Clear
) I5 [0 B- u' `' S - ; }2 `5 ?; q1 X+ ?
- ;清除 RAM $0000-07FF
' n; K R( I. }8 j - LDA #$00
" _2 l: L% v7 A! B/ B - STA $00# L b& D4 N e/ x! c
- STA $010 V7 }/ j2 Q4 o F
- TAY0 J/ T1 {2 o1 w' V4 t
- LDX #$08
* a8 r; F7 Q. I3 q# _6 J - .Memory_Clear
( C5 N: r1 E# R& h% n - STA [$00],Y1 {6 z$ h2 p8 R* N* F. m
- INY6 b; L T. S: M9 d
- BNE .Memory_Clear; f% \4 g; }# p) y9 u
- INC $01! A! y, O! F8 K. T, R
- DEX: T- m- c4 o: m7 U+ P# J
- BNE .Memory_Clear
( c# b8 B; M; U -
- K# }, ?/ {2 l2 ]3 u$ I' l8 y' M - ;精灵缓冲初始化, d4 _5 N# `5 I" f
- LDX #$00
/ H, l3 R; k1 S6 D, q - LDA #$F8
" D2 ?7 z+ w* Y - .OAM_Clear+ S# a4 }/ _8 d
- STA OAM_DMA_Buffer,X% x6 _) ?2 s/ F1 o
- INX8 C: G& a6 ?3 K( u5 a: g9 n2 g
- BNE .OAM_Clear
! K9 [' ~7 b; A' N; D - / z, k! q. @: {/ ]. C
- ;栈指针初始化) A4 k* c1 ~: x0 ]9 p
- LDX #$FF3 F8 J7 m. N$ C
- TXS
/ Q5 m0 }7 I7 m! l - ) a: W7 s' ?0 v# j# I# h) Y
- JSR Nametable_Clear;命名表清空
& Z g/ p0 I. `, r - JSR Palette_Init;初始化调色板缓冲, Y! M5 ], P& C) T- ^" {, N
- JSR Static_Text_Init;初始化静态文本
4 f7 B' O; x" ~% T* A* a -
3 e) q& g4 L( x2 s6 y - LDA #MUSIC_ITEM_TOTAL - 10 y9 M9 B5 T+ v" V( b+ }
- STA FC_Music_Max_Index
N# i7 g/ l/ `4 V8 G' e - * H. q) i; W0 h. a) r( u8 M
- LDA #$1F# h6 k1 y# y2 B5 D0 U% s1 O4 l
- STA APU_STATUS
) {5 Q$ [% L8 ~ - LDA #MUSIC_BGM - 1
# a, m& ^8 t5 ]% w2 M7 ]$ ~ - STA FC_Music_Index
) w/ o, c8 d& x+ u% p - JSR Music_Init_Process;音乐播放
2 J( C( R+ G% x+ v0 t6 ^ -
4 g; |" y2 M0 V4 o4 q - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)% T# ]( a0 B- Q
- LDA #$1E
8 a; |7 s1 `7 ^/ `8 c5 V+ Q% O - STA FC_PPU_Mask_Buf: ^6 p" w2 `" P$ X2 f# V0 Q
- , U- f+ f5 X( z# W/ E
- ;启用NMI处理
9 |7 V& j) [: r6 w2 `, e; ? - LDA #$80
5 p5 Z6 T9 R' K3 D. p6 ^ - STA PPU_CTRL* h1 O& i" {9 c; C: U( @( E/ o
- 0 i6 S2 g: r0 @' X
- ;程序循环, 剩余工作交给 NMI 中断处理
; T8 w4 T$ d, D9 b) d/ y - .Loop* y8 @. C$ ?6 U. E' |9 y0 F( x
- JMP .Loop
: }& m, K/ n! g# J/ u+ }
* f5 D* b9 X' b# r. O: r- ;======================================================================- e8 j' \- `3 o" K! x
- ;不可屏蔽中断处理% m r. W& a8 A+ N/ N
- Nmi_Program, H3 X" r. ^: h9 |6 ~. }6 Z" D" F& @
- PHA
# p: A/ Z, q& R! T1 E - TXA
' C1 K, f3 J: F! I4 | - PHA: n6 d- o& l4 c! p! _4 A
- TYA. z% f+ Z8 m8 C, A: X
- PHA
: C/ v( a8 J2 V2 [' b -
8 Q9 j5 H- ]4 s7 F I& Y- ?, L - LDA PPU_STATUS;读取使得 PPU状态寄存器复位; _! H8 j+ n& b# A+ C4 o! k
- 9 G& b/ R8 W$ X0 z- v* _
- JSR FC_PPU_Procrss;PPU处理$ k' `0 c' F7 Q5 [4 d) V
-
* _, c+ I: Z( e, s" n4 w4 c0 C, a& F - ;精灵内存更新
9 Z) y8 c+ P5 P: |' `$ _ - LDA #$00; k, w, K) Y8 N; i; z4 o8 \- j6 n
- STA PPU_OAM_ADDR/ {$ l K- _5 Q- C
- LDA #OAM_DMA_Buffer / $0100, [) a7 ]2 L6 U# [& `; N
- STA OAM_DMA0 G: n* ?, n' I4 X1 u. y* w
- W4 K" T3 _' o
- JSR FC_Gamepad_Process;手柄输入处理. K+ J! a3 A i: r" t
- JSR Music_Select_Process;音乐选曲处理 B" e1 `2 }# Q
- JSR Music_Play_Process;音乐播放处理
, g' h$ n) U6 }: k - # m, K6 y# ~( N5 _! Q g' U. Y
- PLA
* ^7 [& V. x/ J5 q- n( y - TAY
" J; O6 X6 f# f- Q/ c& B5 A4 V5 P - PLA
9 e- r# c- R- P6 R- D - TAX
; ~9 d0 I" I$ X0 ]" x, j. @9 T+ w - PLA
$ a4 b, A7 X# r, f% D+ L
0 W& P3 b; M1 S! J: f, r- RTI
- N) l, Y, V- I2 p - 2 H( }. u1 ?1 ~7 G" F% `
- ;======================================================================
0 m4 p4 ]! N! b! r* e' ]. \4 z6 ] - ;请求中断处理. x O: m3 X5 _4 Y2 N8 B# M$ f! Y
- Irq_Program; c. [2 }; s6 ^# _
- RTI% ?2 ^( N2 w$ X: e T$ _
- # J. r2 n& G9 c! [6 z T' S
- ;======================================================================
u; ]" l+ l6 R0 b, d5 `8 F2 g q - ;中断向量表% p. Z- s1 h' \( n% h
- .ORG $FFFA/ E1 R. t* ?# N, \- t- u8 Z; F) K5 e
- .DW Nmi_Program ;NMI触发时执行- e5 ]. i" |# ?( U- j: C$ z
- .DW Reset_Program ;载入ROM时最先执行% E# p, _ d2 i; O
- .DW Irq_Program ;IRQ触发时执行' V @$ w) S7 a* `5 J+ ~
复制代码
! d6 Z4 l2 H2 N& \ V- p, D+ Z+ z- q. r: T0 O F/ v6 R% v1 p4 C
4 h$ e4 [* `( d
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|