|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下* U1 K, V1 j$ r/ m- @+ L: B3 p; k
3 }: b, T8 D9 ` V3 {& V* B5 Z
以下是主框架代码:
! Q2 b& D% a& j7 M- ;======================================================================
; u9 j- ~" E" ~ y1 @; l - ;文件头9 _: J( [# g* C( i+ X% X8 L: H0 Y8 L2 W! Y
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
7 ^( J* b: d- K( W4 l - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
/ ]% j4 V6 a; m n0 f1 v - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
8 y$ P* m2 n) _, ~4 U - ;======================================================================
8 v0 _; ~# H0 m2 ~' R - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2' H& \7 U, m7 s; e, P0 f9 Y
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 13 J; ]( @3 V+ q- O7 S) U3 L
- ;======================================================================
1 A8 I! L% M3 ~% n% D - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1, y3 o& t( X5 I1 ^7 R- j
- RESET_ADDR = $E000 ;主程序起始地址
8 t9 s8 Q4 x0 D; r' O7 x& @* N# m - ;======================================================================
3 V6 \' s/ V# x+ @4 S3 R - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB1 D# {6 U( m1 G* Y
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
3 m+ g0 o3 T, r! _3 u( O* [ - .INESMAP 4 ;Mapper号 (0-4095)$ P% F# I1 [" M$ n
- .INESSUBMAP 0 ;子Mapper号 (0-15)
0 `5 Z- K+ M( d8 H# G2 n - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)- Y8 F, I" s1 p" u: |0 G# u- I
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)8 P6 N8 X/ }* v7 f# f- ~1 Q0 Q$ [: C1 n
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
3 ^% L) k/ S" g0 e. x6 S& F - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
4 I# n9 A$ k( i - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)' Q( ?) M9 _* X
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数); S3 S: `5 s# e( d5 e0 F3 `
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
% G) i$ T8 ]" S6 W+ c& c - ;======================================================================) T( B$ g' \0 Q* J
- .INCLUDE "fc_demo_config.asm" ;全局配置
0 f+ X+ J T& x% Z) z - .INCLUDE "fc_demo_constant.asm" ;NES常量5 ?) L& G: c) q: g, \
- ;======================================================================
& Z% A* s- e! U1 ~6 C. @/ P9 r: K - ;音乐配置! z) u# X/ }2 x+ Y) X
- .IF 0 = MUSIC_THEME
{7 p- j/ _# W$ \' O - .INCLUDE "data/music/Gremlin 2/config.asm"# v3 p) _; f$ {% P# }: Y9 D
- .ENDIF3 q1 i, g) r$ v1 `+ Y/ u
- ; G" ?# V8 G4 ?, X: n( C4 D
- .IF 1 = MUSIC_THEME T* C v8 @- n
- .INCLUDE "data/music/Raf World/config.asm"
- |! }$ f4 E5 P9 v8 S( Z - .ENDIF" l' L4 ]1 E8 h; V2 E% }
- ( d& I+ T6 S$ }6 `6 z1 Q+ y5 I
- .IF 2 = MUSIC_THEME % R0 T8 S1 Y( n6 Q/ ?0 w8 b# r
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
7 `* Y e; d" O& ]7 J - .ENDIF
; Z ^2 ?0 p3 x0 z# C' i8 P - ) _9 K$ K3 N* u+ u l9 o6 b: o
- ;======================================================================. J! `8 F6 E6 [6 Q5 x. B
- ;引用CHR图像数据! r- \) g+ R; I
- .BANK NES_16KB_PRG_SIZE * 2) l& C# x$ Y. t* R
- .ORG $0000
$ p+ i4 H7 w0 ]6 U ~# ?7 b3 g8 C - .INCBIN "data/bkg.chr"& S8 Z' g6 O1 b. p. Y4 r( T' x
- .INCBIN "data/sp.chr"% z& o; u( o( S
- % U2 `, ?( w6 t* q2 Y
- ;======================================================================: B0 R# B3 O6 s' D5 l/ T
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank" M# `7 n9 g6 F% F, p- W U
- .ORG RESET_ADDR6 W+ k3 a Z' U5 W
- ;======================================================================6 {( z, a9 O$ w
- ;引用其他源文件
& Y: P8 N7 \/ o D - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
) p; K9 a+ \+ c, C9 h1 y) _ - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
9 C2 V) V/ F! I& W - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
% N% o0 ]/ E& a6 \/ l; S; \ - ;======================================================================
: u. Q; t0 H% T* w5 X3 k3 {, I' X - # L9 f. h9 O8 e/ w
- ;======================================================================
. p6 P0 m# V$ M x - ;等待VBlank到来
4 j! A& G5 y/ N! U6 C, z - Wait_For_VBlank
8 l3 \1 j! W0 r+ @! n; | - LDA PPU_STATUS6 X, h) p' N. Q; l8 Q/ ]
- BPL Wait_For_VBlank
; e( U# P0 F( [4 { - RTS
4 x9 ?) k1 _% ^; L" e
" N' `1 N6 z4 \4 J( B/ [- ;======================================================================/ ]8 \, l1 i' {6 r% Q1 s6 p8 z
- ;调色板初始化. B" l. J. w' |* z* R+ Y9 F
- Palette_Init
9 V! `0 w, L! k( N5 y - LDA #$3F! b; g* I* h5 l
- STA PPU_ADDRESS
4 J! q+ y3 j* m) o; n$ ?/ ` - LDA #$00+ t0 ?: q2 s k+ ]! V4 m+ x5 ]5 A
- STA PPU_ADDRESS! n# ?' L3 r$ z+ ^9 K- o
- LDX #$008 ~0 a7 x- Q/ Y3 e% I
- LDY #$20# C+ p4 A, n5 H9 O' Y- o' G
- .Write_Data
4 w& u1 u; r8 G8 {3 @ - LDA Palette_Data,X/ Q8 m H O$ R1 }. C, e
- STA FC_PPU_Pal_Addr,X
% z8 Z3 F! C4 w; j; B9 T2 e2 R - INX
& i" h5 L% }; P1 L - DEY: j7 U! r" A9 A @! k
- BNE .Write_Data
6 Q) m1 d- R6 C: S - .End
8 p" [" S9 V" k% \" w - RTS' ^4 Y3 r# b: Z# }5 \( M! Q
- 6 j& r8 C( s6 T( r4 V2 I+ k/ [* x
- ;----------------------------------------
2 N6 B' a! Q/ t$ S; f - ;调色板数据: ?& ]3 W; m0 J3 L) H
- Palette_Data
1 y6 s' z) |) g( a7 w V - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
5 F: _: J; W' a7 m: I- D# X - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
& r( O* A) A! s -
8 L% W2 x7 B* G3 l. o S - ;======================================================================
0 \9 u9 Y" V0 T - ;命名表清空
A" T0 H. I: u/ g2 r - Nametable_Clear
* C0 H1 i; S( p! L( A - LDA #$20$ T6 A9 @) a6 H/ t) P
- STA PPU_ADDRESS+ X' K2 x/ v% u" B8 E6 t! p
- LDA #$00
) {9 v; `3 t5 s/ L; O5 a3 ~ - STA PPU_ADDRESS" I! l, I0 C+ i4 g5 C4 R# `. L
- LDA #$00" ~2 f+ c7 s7 F5 }& V9 Q+ R5 D
- LDX #$000 U1 G* X; `( W- L
- LDY #$08& w( S+ y) p0 Z. E4 v7 E
- .Write_Data6 L1 s; d' {/ @( D" E7 H" \
- STA PPU_DATA7 }7 d8 J- N- V% @# u( P: S
- INX
" O. b, M6 x& J! }* b5 \ - BNE .Write_Data
$ c$ m- Z; i( h+ `. m - DEY+ Q+ \6 ?# o( d+ j; X2 {! a+ F
- BNE .Write_Data+ O! p8 j) A v; X1 e4 z
- .End0 Z, B2 Y) O2 P, K( a5 }* I
- RTS) `2 K; W# v; |, J+ M
- 1 } R, x& ]6 S; h6 G/ O
- ;======================================================================
/ D/ S2 [8 u* r4 V3 X& u0 H( l5 m! W - ;音乐曲目切换: \+ U# a0 N9 i) l( N3 |
- Music_Select_Process
8 F4 s2 a; U9 q. h6 ?
2 n# d/ D% \4 U: R. M. t6 R- .Pre_Music;上一曲
2 M4 P+ H: d. q- w* k& T* u- B - LDA FC_Gamepad_Once" V- D$ H3 t a% V
- CMP #JOY_KEY_LEFT
$ H3 X$ X: w0 @' B$ X! W. y- k - BNE .Next_Music$ V% f3 j, l) E" V6 \' a
- JSR Music_Play_Pre
! k5 @( ?! e$ y/ W - .Next_Music;下一曲" s8 s1 ^' t: K! a6 d- Z
- LDA FC_Gamepad_Once/ I& F4 ]5 J4 `: q$ ~
- CMP #JOY_KEY_RIGHT8 M: Z1 l' S0 |! K
- BNE .Next_10_Music
. S3 `$ {0 Q. P( ~3 G! D9 Q - JSR Music_Play_Next
$ s* {8 e) R9 n4 k - .Next_10_Music;上10曲
; Y/ j0 {( x( W0 M2 N1 r# d! O9 } - LDA FC_Gamepad_Once
: y Z k" D1 Y - CMP #JOY_KEY_UP
- u( T) f. M9 M! w/ \ - BNE .Pre_10_Music8 V# u5 t3 C* y
- JSR Music_Play_Next_10$ F9 y+ Q. L0 K2 p" o3 E/ K& t1 o
- .Pre_10_Music;下10曲( A1 c% T7 S1 I" x1 r
- LDA FC_Gamepad_Once
- M+ q/ j2 V6 Y# p" J/ V6 G - CMP #JOY_KEY_DOWN
6 g0 D2 S2 H% x% V0 F" h - BNE .Reset E1 v& b3 n! k6 Y8 r
- JSR Music_Play_Pre_105 F: M/ e) s4 \$ O) q% u
- .Reset;重播当前曲目8 ~: J W; F+ S1 ^) E: c, D1 _( F
- LDA FC_Gamepad_Once
4 t! U& I- G) w) l* z: _" s - CMP #JOY_KEY_START
2 O: `& f5 t% z' I4 d+ J1 C+ x - BNE .End, o8 r+ m3 c. S- D
- LDA FC_Music_Index
- X' O9 F! O& z - JSR Music_Init_Process
7 s% k+ }+ y$ Y- @/ j8 e1 c - .End+ r, |: n! U1 ^: ]7 }. |( O- p
- RTS$ F! p- k; F( S+ g
5 R% U/ z2 t3 A( d( h5 s, K$ z2 {& X- ;----------------------------------------------------------------------: S: L9 ?/ [! P% P* }/ n! s
- ;播放上一曲
( s: ]6 a x: g, v/ M; z - Music_Play_Pre- y; f0 ?2 g# H \ y1 ], K3 p) E
- LDA FC_Music_Index
4 Z& x! o8 p6 l6 Y - BEQ .End
' p1 `6 S7 ` n) X% m% |0 I - DEC FC_Music_Index
/ D0 s% d. W Z ~+ u - LDA FC_Music_Index
9 N9 t; Q) @$ K& \& o4 z1 Z - JSR Music_Init_Process& T1 A$ ?& s2 N' }+ G
- .End
; C! {, {% ^- ] - RTS: A3 g2 P- l0 _
- ;----------------------------------------------------------------------9 J, w1 L' n `. _0 l' p
- ;播放下一曲
R: f4 k6 q+ w/ j/ ^: e - Music_Play_Next* O" y5 z/ b/ I0 K& A+ ^3 F
- LDA FC_Music_Index
3 T9 ?# o6 I5 v& L- F - CMP FC_Music_Max_Index' L; V6 @; u" w% s( z
- BCS .End' ]/ e S7 _- j: \% l* S+ m4 t/ ~
- INC FC_Music_Index
2 z4 U$ Q& X' a5 P$ ~* ~$ K' e - LDA FC_Music_Index
8 F; s( ^# [" Z) b7 s9 o+ [ - JSR Music_Init_Process
) f' {; R# c' h4 X* L7 N! V C' A - .End' d0 C" E( n& [; y0 H; s- B
- RTS( {3 X5 m! x- ?' n) E3 \8 x
3 w8 s) s" X0 m& r6 A% y- ;----------------------------------------------------------------------% F$ _3 X- K2 N
- ;播放上10曲
/ v# A* }: t- R0 U - Music_Play_Pre_10) o0 W# }# D ~: ^; f% o
- LDA FC_Music_Index
: C" g: S f: H' d7 J( @; j+ I - BEQ .End, T+ T3 d4 r. E" F2 l! j
- SEC) R6 ]( O3 ~5 x) m# x
- SBC #10
% w% Y& Y1 D) [; |: I2 @ - BCS .Pre_105 R* `& D/ j- R/ ?- ~! m0 Z
- LDA #$00
) u# v3 f+ L+ ~" Q - .Pre_10
1 q* x+ K. {4 A- w/ I+ O" Z - STA FC_Music_Index1 c; e2 G% i% L. X
- JSR Music_Init_Process
$ {+ c1 _: c% B4 I - .End
# A+ y1 V: j( V3 C. q# j2 O! O - RTS+ O& U. w+ a9 L7 \; i' P
- ;----------------------------------------------------------------------/ Y9 N: {+ j9 X2 m( V, d5 _
- ;播放下10曲3 Y9 |+ w5 i6 Z+ Y' [
- Music_Play_Next_10+ ?8 o* y, R8 U, |1 a! g
- LDA FC_Music_Index
% v- L' L4 |% C2 s5 J1 O - CMP FC_Music_Max_Index
# q2 H3 b4 ?' X! w1 |! d# t: d - BCS .End
4 B5 n3 I/ \' w% u - CLC
4 Z/ ?8 L8 {9 e0 p0 i% z) @ - ADC #108 Z2 Z g& b7 }
- CMP FC_Music_Max_Index" T0 l2 M; w! Y1 W# l
- BCC .Next_10+ Q: F0 `& g/ b( r6 ~7 y( h: W% N
- LDA FC_Music_Max_Index; Z0 O7 W3 A* N5 }. s! U
- .Next_10
g! _3 g" j# X$ j1 u0 F ` - STA FC_Music_Index) ~$ o) ], h X& M! N5 u, l9 q$ @5 ^* l
- JSR Music_Init_Process
5 D1 F' B7 p% l, t - .End* X3 O6 [+ b- q5 J) i; ~7 W
- RTS( W. w( x6 z# u$ D- b
- 3 O1 j T |2 O; p3 ~
- ;----------------------------------------------------------------------
/ K: x, h( c' A; O5 s - ;8位十六进制转3位十进制制
" K9 V" P( j& d |, O2 T* @ - Hex8ToDec+ q: R1 }! z! I* b) s! p/ X7 M
- STA FC_Dec_Data_1
/ Q% A5 ?0 \2 S3 c) Z - LDA #$00- F1 z3 M+ m; E! o# O9 R
- STA FC_Dec_Data_100
$ L$ N6 p2 ?$ c7 h2 m - STA FC_Dec_Data_10# [) D, ?' [1 R3 M3 b3 A3 [! c& P
- LDA FC_Dec_Data_1
3 i1 X/ p; {! F! P/ d7 X) F6 X - .Convert_100+ N P+ H+ S# h
- CMP #100* z0 J: T7 A, e5 {- Q: ?
- BCC .Convert_103 o( t4 d9 h1 V4 J$ R
- SEC. |2 k9 Q: t$ x2 k+ }
- SBC #100( r) h! J1 O A6 ~2 _$ ^
- INC FC_Dec_Data_100( r3 _' W3 T5 o2 T" q
- BNE .Convert_1000 ]7 }0 y8 r$ u I
- .Convert_10
. g1 Y9 z6 F+ S- p7 Y+ |% _8 {7 M - CMP #10
2 n! R1 v: _# D - BCC .End
# ~1 O E3 B: K# _ - SEC
) H8 T1 w) ~5 z& a; d - SBC #10
! n4 `5 H0 Y) {9 m - INC FC_Dec_Data_10
* [0 ?; p1 S0 R$ c - BNE .Convert_10$ I( c! x) z4 S' u7 m0 k" s
- .End5 m6 ?0 z$ ]7 O4 c
- STA FC_Dec_Data_1/ y" N8 l/ T9 v/ Q) `; q
- RTS
' A9 X+ }: I# j& `
* ]- S' }& {0 c; b: l# L- ;----------------------------------------------------------------------3 U+ a& J; Y: _9 A) G: }* X
- ;显示曲目信息, g" C1 B! k: @) N
- Music_Info_Display7 ?! Y7 L. V' v) N$ L
- LDX FC_PPU_Buf_Count' e( J% O0 R- ]; @$ R6 H
- LDA #PPU_WRITE_MODE_CNT_LINE
; y$ ^' t% F: S1 y1 a+ [3 I - STA Use_PPU_Buffer,X$ j6 Y7 ]8 f$ p
- INX. C' |3 g8 q2 U( i
-
$ g& J" E3 Q) |* c, n; b' ` - LDA #>MUSIC_INFO_POS
/ }+ k) j: V% h( }* O) ~8 [ - STA Use_PPU_Buffer,X
- F+ M4 n+ Z" ~6 }" F, {1 `' q - INX
8 A) J. D* ~) O5 ^/ y - 6 V2 h. s+ w8 O1 o
- ;居中
* x! q! s, t V0 f R! u - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2; n# Z7 _; B! d
- STA Use_PPU_Buffer,X
( Y! [) O; h- v* N - INX& ^: |: K; C2 I) P0 b" |2 L5 y
-
# ]1 Q0 S8 {- f1 X( J: A - LDA #$05
! v( C! s' _2 r- x. M2 Y" X7 e9 s - STA Use_PPU_Buffer,X
4 w9 {" m" M( @; V* u, Q - INX' u/ ?1 x, s$ `, y# R
- 5 y/ U; l4 Y5 U1 @: s2 ]/ F& t
- LDA FC_Music_Index
4 s% k# Q. J4 ]3 L' a - CLC9 M% F2 Q d, V/ ]( N* f
- ADC #$01 v# a9 L( q9 G- U' T; v
- JSR Hex8ToDec' G. p2 Y' u8 {$ y3 q% @, M; d
- % m Z5 j5 p L0 ?& O! `* c) F% A3 q
- LDA FC_Dec_Data_103 t3 M9 W$ ^* g7 ^5 L t% s/ w
- CLC
1 H K" Z% W0 X" L* K - ADC #'0'1 ?- C2 b& \+ i* w
- STA Use_PPU_Buffer,X9 [: P- z! C/ c) B2 |
- INX9 b: I, R0 g% ^) B- ]) a7 T
-
5 {" m* t) K) H. m# H - LDA FC_Dec_Data_1+ Q. w& p4 a3 j! {) o
- CLC S6 e1 S2 Q1 q" Q3 q! `
- ADC #'0'6 c, i6 c1 `6 R; b3 N8 _1 G
- STA Use_PPU_Buffer,X8 ?2 i- j$ Z9 j9 X
- INX6 b x2 E o7 y0 E& g
-
% M- y$ H# k( T" W7 R I - LDA #'/'
0 t$ w: ]1 W+ i8 J" V3 A& h0 e - STA Use_PPU_Buffer,X+ c% @9 [( Q0 U' I1 B/ ^* a
- INX% s# z& x5 v$ Z! h+ K8 j; b5 X5 {
- ; }2 U3 H; g2 ^7 K8 M/ G3 c
- LDA FC_Music_Max_Index1 L9 T% u7 M" M8 a0 I1 i4 ^
- CLC
/ }" ?, x# O y( | - ADC #$01
. m7 q6 R. z$ r! H2 \ - JSR Hex8ToDec
$ j( R+ I) t$ W- [( t: M - 6 ^9 R7 c3 Y4 |$ S$ J5 G
- LDA FC_Dec_Data_101 `+ O! ^. ~$ O$ j3 a# Z
- CLC
0 M: B: n& W7 K- A7 z - ADC #'0'
4 o I/ X# u" g2 X- T3 D" { - STA Use_PPU_Buffer,X
4 W0 o. C7 P% g - INX
2 R% e/ M! [9 k% I -
2 a' q! l- @; o7 @# F. W# ~ - LDA FC_Dec_Data_1
4 S" K- j9 x& e+ P1 K7 V9 n7 y - CLC
* @: `' m8 M d# u: d9 ^( M - ADC #'0'2 W8 s# Y+ S2 C" y4 q x) e/ j
- STA Use_PPU_Buffer,X" E2 A! }( o7 A3 Y, v
- INX7 f" x/ u D2 t X' d4 K
-
# _9 @' Q6 ^4 E4 N - .End4 K/ r5 I. k; t! _0 h: ^
- STX FC_PPU_Buf_Count
# H2 o3 p9 L! c3 \: T - RTS
9 y$ E2 U m9 C2 ? w! j
- w3 C( X0 K; H( g- ;----------------------------------------------------------------------
8 ]" B. u4 H( U- F5 S - ;音乐曲目初始化处理
2 M1 A4 O0 P& f, y% G2 ?2 I* X - Music_Init_Process
2 O% n6 Q( U7 J1 d) w - PHA
5 G$ u5 O5 t0 _! L) x {; o - JSR Music_Clear_Process6 R; c8 j# \* l! b0 v
- LDA #$1F
* y1 T+ c/ P& I - STA $4015
2 p- x& z) w I: O0 Q" ^ - PLA
6 m, \4 [7 ^% Y% D/ k - JSR Music_Init_Addr1 ?7 [, O& S b2 F
- JSR Music_Info_Display
+ x$ n8 f# `$ Q8 V2 C - RTS+ c6 Y& T; C& V6 O( _5 w1 E
- ; L5 l3 B6 T, {2 Y- ^% k
- ;----------------------------------------------------------------------
3 m6 n U4 ~2 d2 U3 A1 a - ;音乐播放处理
5 N4 _- o+ e O! R; B. L! k - Music_Play_Process
- t7 m1 ^* J! E5 v1 U - JSR Music_Play_Addr3 P% ^+ p% B2 Q" d1 v+ `% }9 \
- RTS
7 k/ T& J/ M$ ~/ |7 h - L7 y; ]' a% C
- ;----------------------------------------------------------------------" @6 |4 L5 J( b p y' X
- ;音乐播放处理' D; o% z3 q6 h
- Music_Clear_Process% v- T) l+ z9 {6 `" Y% \
- .IF Music_Clear_Addr
: J) ?4 o5 e: c. e( c3 g& Z - JSR Music_Clear_Addr
/ v, U: x; J5 q# D3 s- G - RTS
. i" \$ j- s0 z$ c - .ELSE( c0 v) F) V% L7 F+ p/ H# G+ c
- LDA #$1F
- [. ~; l: W- t3 i0 j9 | - STA $40158 v7 N/ e5 t+ j
- LDA #$00" {8 j0 U/ s) m* W, ^* z
- STA $4010
4 }. u" ^& d( k9 @ - LDX #$00" T0 `3 u# @) f/ Y5 g5 k+ t
- LDA #$00
8 ~* w r& m ~4 ?3 i# I - 8 { c7 O5 c# G3 V# H# d1 l
- .Music_Clear_Zreo_Page_0& ^% e. B* U+ @, U
- STA $00,X
" H4 y$ ^- f2 C! V, y* ]; Q: U# f - INX
4 f2 Q" r8 G9 a7 { - CPX #Use_Zero_Page_Begin$ F) ^) B- T# I! f# Z) }9 K
- BCC .Music_Clear_Zreo_Page_0
$ S* t! a7 i6 [( x -
% l( b1 j% [" Z8 i - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size5 [) |6 o, |+ Y
- .Music_Clear_Zreo_Page_17 c+ a+ a% J* P3 E0 J' o
- STA $00,X9 r+ @4 I0 s& e" W
- INX
2 {& F. j1 F* x3 P - BNE .Music_Clear_Zreo_Page_1
8 ~5 j, e$ @# m( r/ V - `/ Q9 i6 [( j. _1 u; ]* y
- Music_Clear_Process_1# {0 u2 B% U( \2 a8 ^7 f$ p
- STA $0600,X
3 a/ \4 y' c0 U; N3 z7 Z$ q - STA $0700,X
* R& M% f: k8 h/ P2 Y# [; l - INX
( y2 s1 f0 ]3 S. w# P: Q# w/ G$ F - BNE Music_Clear_Process_1
$ d) Z/ k; b$ q# s. `; ~ - LDA #$10, f/ e; @: X3 j- J' V! W; G3 O, d1 c
- STA $4000
. h7 a8 H9 h! z1 D3 n5 U - STA $4004$ m$ g1 Q6 f5 L7 N0 H
- STA $400C
% H. n7 z2 {. Y2 J0 H8 S - LDA #$00
/ O$ Z" C- _8 L- M9 W% y, C6 S - STA $4008
' T, x$ x# @3 _$ X - LDA #$0F
& A) A/ Y' W: i* [& I9 D! L - STA $4015
8 s; T7 v4 `" u6 W5 k1 \1 V/ A - .ENDIF* U' |' ^( \% ^7 J+ B9 j
- ; x) C7 n% o4 o- v6 F
- RTS
2 P( ]9 c+ ~# P) q - 4 f$ X3 a; ^; D! U. a, j( g
- ;======================================================================
) c$ @! A' j: H - ;重启处理% `% J& Y Z6 @9 x+ P0 @! y5 e$ Q
- Reset_Program& I9 i6 h' b+ d# D+ M
- SEI
8 l8 a: M1 V" C3 `. F - CLD/ a# a! M k/ I% A& y) x
- LDA #$00$ ~& C7 H x8 k1 M4 \1 v$ [! ]
- STA PPU_CTRL
- } @. g8 P+ A; J2 `4 w5 O! L - STA PPU_MASK
3 ]( I: U0 i( z, q% y2 @ - STA JOY2_FRAME# u# I. j! {1 y
- STA APU_STATUS' T* I2 F, G9 Q% Z( S# u; Q
- 1 X8 N$ w, e5 q% O3 l
- ;等待屏幕准备完毕
: |1 {1 L: X7 B3 K6 H% q - LDX #$024 l7 N x8 L# W
- .Wait_For_Screen_Ready# m! g$ P# _# A
- LDA PPU_STATUS: s0 y, B6 S' p- w0 g9 y
- BPL .Wait_For_Screen_Ready
; I7 L" Z' M- N7 L' @: u( P, J - DEX7 _ w. s* ~& ]# b' \( t7 p4 `
- BNE .Wait_For_Screen_Ready6 M+ X1 ^0 b9 y7 U
- 3 r1 K. Q! f( C% P( q/ F" E$ |
- ;清空调色板3 J- M3 Y" I% ?! Q( g) l" ~
- Palette_Clear9 Y" M$ i1 `& w3 ^* ^+ l
- LDA #$3F$ y* Q1 o# d+ e# S
- STA PPU_ADDRESS
; G, P4 S% [/ J# w% `, } - LDA #$00
% i2 \: ^ q' _3 g( T - STA PPU_ADDRESS
9 t+ R u/ L& f4 D# U - LDX #$207 k) \9 \7 Z' V/ u
- LDA #$0F2 g5 X6 r% z z, L7 c' o
- .Write_Data
% N: R" X/ v z- u3 p - STA PPU_DATA
1 n5 q; P$ d* a3 q - DEX1 d6 D, ` s; ^5 D( y
- BNE .Write_Data
% b# X$ `% w. X2 {4 k. E( l3 q
% l/ G, p X, h+ p: ^2 ?- ;清除声音 $4000-4013
2 A4 }/ h. h3 ^" O$ m - LDY #$14* q- }$ t& u' d# T( U
- LDX #$001 H1 ]+ B$ b) H( [/ {7 @, Q* L
- .Sound_Clear% V- n5 Y. X! ?, |
- STA $4000,X7 C! M/ g# N6 m* U( u) O0 c
- INX- Q9 A1 w0 [. h* Z
- DEY) f' q( q9 \/ G) ?; t4 X
- BNE .Sound_Clear
! Q C; J- ^& h# M -
. f% c* w3 D' ` e, t$ V - ;清除 RAM $0000-07FF2 M' G4 w* h' j6 Y1 u' q1 a# i
- LDA #$00
% S, i+ s% }7 R. f& |5 I6 w - STA $00
, A9 q- K' L% r1 ]+ W; l - STA $01: w: x4 h" z- ?3 i( {) i. ^7 L6 ~
- TAY3 i* s) G& ~4 e: M4 T. J! L
- LDX #$08, ~$ Q3 e0 d- H+ t. m! X% W4 r
- .Memory_Clear
1 u4 u e" u* J+ \7 a& e- A+ B8 G8 \ - STA [$00],Y- T, e2 u4 ^( d7 I3 Q
- INY+ X ]1 E' m3 m% z' j+ w; u
- BNE .Memory_Clear7 i1 `- U# F. `# w
- INC $01; X# z! y6 x/ Z; k
- DEX
1 C+ H/ ~/ C2 q: g+ g) M/ p$ x# i - BNE .Memory_Clear
, a1 R* h- O& _* m- r# c& } - q$ }# c, r+ {5 Z" E( }
- ;精灵缓冲初始化( Z Q2 m5 P# x! C5 j3 X7 H
- LDX #$00" G u* c# D% Q1 J' n! o5 v9 _
- LDA #$F8" M X @, q' }' B. e
- .OAM_Clear
( W$ ~( \! N0 y3 d7 v - STA OAM_DMA_Buffer,X
7 v" U. B( A: [8 ~' Y9 n% P! g - INX
6 ?) Y- o8 G ^0 m7 B4 U% ]* z - BNE .OAM_Clear
$ f5 Z8 N$ Q- K+ E& U; W -
# b8 u! n: v, G3 z7 q - ;栈指针初始化
' D, k7 W" c/ r# @0 w - LDX #$FF
, h& d$ @# {3 o& A2 o3 ` - TXS' }' o3 s8 w. {0 V8 U2 _. c
-
1 T1 {+ Q8 I4 m3 b - JSR Nametable_Clear;命名表清空$ B; u' N- A2 |
- JSR Palette_Init;初始化调色板缓冲5 s8 x8 d5 G5 @* `# K) I
- JSR Static_Text_Init;初始化静态文本
. H7 W) Z' ]" X" w - $ f- m# T" b8 H* T
- LDA #MUSIC_ITEM_TOTAL - 1# b) G/ @6 o) f' a/ l. n. D$ U
- STA FC_Music_Max_Index0 i' g6 d m% w! w; U* L/ n
-
q1 p1 v3 l) r0 P - LDA #$1F
9 n, O2 o. c3 K( t - STA APU_STATUS
# U+ x% W9 z- Q( W2 T9 k - LDA #MUSIC_BGM - 12 |4 K; W( Y" v' n5 _8 ^4 w7 w( L
- STA FC_Music_Index5 a9 n x7 t2 }' D3 E! o7 Y
- JSR Music_Init_Process;音乐播放. G# Q2 F% `8 f& c4 P
- & j9 B; R+ ~$ t+ C1 o+ t1 P
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)6 e- c# \6 P _
- LDA #$1E0 h/ M; G% X- D/ P) Y8 c# b
- STA FC_PPU_Mask_Buf }) U( S1 }* v! j9 t/ n
- 3 X9 d0 O. _! o3 }1 S- L: I
- ;启用NMI处理
- O! Q; W- p F3 D - LDA #$80$ c9 N, h4 t) M
- STA PPU_CTRL0 l6 e3 w( p. u2 [3 v6 p& w
-
+ ~/ K% W# O. i% ?2 I+ L, s5 R - ;程序循环, 剩余工作交给 NMI 中断处理- E4 L2 m& P {! R
- .Loop. B0 y' [- W6 O0 n& r6 f$ E
- JMP .Loop* ?) D" \4 C7 U8 k6 s9 ]# X! [1 D4 e
4 M# o# z- [2 N9 h6 o3 t- ;======================================================================
* ?/ }& [2 D& @' ]2 R9 r3 ] - ;不可屏蔽中断处理+ q+ e; l: n9 ?3 }6 I8 X5 D* h
- Nmi_Program7 F+ q( ]9 P) R5 A
- PHA
* h% E3 d# Z7 ]) X! E# C - TXA3 ^# }' `/ a" M) T* e# Q
- PHA' j; ~* K3 D$ u% U' ^- s( C
- TYA
1 i; G- U$ {: {2 e& n4 _( _ - PHA
& _) k, t/ K: j. s8 T -
: t/ E- z- N) z6 y- z - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
" p) X2 Z* Y$ V2 Q! f" q' l' v# c - 7 U- \: n" y: J4 p7 |' m
- JSR FC_PPU_Procrss;PPU处理
4 e* r0 l( o& k7 G+ C- h2 N0 J1 i - ) [2 W! |/ ~& c6 D0 V
- ;精灵内存更新0 e9 g- a% s' S: A Y
- LDA #$00
- F) f5 F* Z0 e+ N6 h - STA PPU_OAM_ADDR" x1 M, M6 Q' N) i: \; V; t& t
- LDA #OAM_DMA_Buffer / $0100
0 ?4 s$ A" b% e+ K# U5 U8 L - STA OAM_DMA4 w7 [0 z/ U- U% ?4 D w
- + q6 H* I# q: ^9 j, @
- JSR FC_Gamepad_Process;手柄输入处理
! |/ {9 R2 r; C+ Q. o - JSR Music_Select_Process;音乐选曲处理( U! K: ?2 L, v3 i- V
- JSR Music_Play_Process;音乐播放处理
/ Y1 m2 \; V6 I# r* g, S -
: e% I& i( {, R* t6 x8 _0 a - PLA$ B- r; k% W+ ~1 `
- TAY
4 x: X6 X0 c9 z' n4 A! M - PLA9 E5 S% d8 U1 r$ m; X4 ` P
- TAX
0 @6 i5 j: V$ Z - PLA* { D- G3 S. r5 T1 `1 C6 S9 g
- % i( ^# }& ]2 }: W; f. ?4 V
- RTI; N) p2 f/ D2 O' t
- ; p8 A" g* |3 p$ m. ]: Q( q
- ;======================================================================$ d4 E+ e" n% T2 B: j
- ;请求中断处理# ~! W( A7 H$ J- _/ J6 E/ X( F) V
- Irq_Program' U) i! z. S) ?/ `/ Y7 |! R8 P
- RTI
* ]: ^( y; q+ |
8 B! y [9 e0 |1 T( ^- ;======================================================================: P, B; `0 y& n! i+ r8 b
- ;中断向量表
2 d5 g i; g5 f+ E$ o; s1 _& p - .ORG $FFFA
, T4 a; s. m3 v" H - .DW Nmi_Program ;NMI触发时执行
4 H& n" b3 H# A; c/ f6 h* S6 a! x - .DW Reset_Program ;载入ROM时最先执行
9 e8 L7 z/ M) z) L. Q* G7 G - .DW Irq_Program ;IRQ触发时执行
- F0 e' i! Y# j* s* {4 t5 s
复制代码 ( }; S% M8 {4 E2 I+ ~: s$ T2 \
6 z1 K/ b) M( \- l y+ d; h7 N. Q1 s
/ q; V1 C3 i2 y; z4 m: a* `https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|