|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下1 o' x! h7 ?7 P+ e r0 x
/ G* t: m' K- m% Y
以下是主框架代码:
% \! w# U; [' }5 H2 P/ [( ^- ;======================================================================5 e& P" F z2 o& A* V/ C, Q
- ;文件头/ n8 s, G* g: ~+ o, v
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
2 F% {7 c# M2 F+ N' `: e$ ~ - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量5 ^ H9 a- }% H/ F2 T V
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
! p. \ ]* i5 ? - ;======================================================================
( ?) H- F6 [7 `9 s+ p( Q! c$ a - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 29 r! Y& t" [& s' Y* ]' H: M A- L1 ~( W
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
" i" s. ?, r9 G9 i) m - ;====================================================================== ~1 ^' V' ?- J% ]1 Z
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1- v5 p) Q7 c( i9 |: \- y# ^
- RESET_ADDR = $E000 ;主程序起始地址4 r$ u1 O0 y2 F( q( l) [, S8 O5 U
- ;======================================================================4 c4 J. F/ q) G2 ^3 q: v
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB4 o! C- h7 q; e& I+ G0 O6 i; A
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB4 |; k9 X# g2 ]) t4 b* Z
- .INESMAP 4 ;Mapper号 (0-4095)" R# k$ W6 u/ d4 X
- .INESSUBMAP 0 ;子Mapper号 (0-15)
( V7 X& @9 w- K" o! p6 E; [ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)* ]4 z* X7 c( c# ^& j: I2 R
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)9 E) T/ c8 H" b. J/ B$ ~
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
. @7 M1 ^3 L3 P! u, o( q - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)+ t, `' X7 S$ z1 b; o! b
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
" k3 U% n2 X0 `. B* ^5 ?9 f - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
8 G& O: @/ g3 Z6 R, `3 F9 g - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
% q2 D0 j) f7 f - ;======================================================================
: I( K" g$ W4 j, w: M" x - .INCLUDE "fc_demo_config.asm" ;全局配置- H7 B8 @9 N6 r
- .INCLUDE "fc_demo_constant.asm" ;NES常量
9 M% z P) @' s0 z6 q0 j - ;======================================================================
" W, u7 v7 F* b* \9 ]- E - ;音乐配置
. R# p1 G: G, n. _% i - .IF 0 = MUSIC_THEME ' X7 c- V( y' N& v" K: Y
- .INCLUDE "data/music/Gremlin 2/config.asm"* v9 f1 f: T; Z" {9 w
- .ENDIF
- [! P$ s4 d# z+ D) L- p1 V5 c# u - - v! G" n$ i7 M3 l! _$ h
- .IF 1 = MUSIC_THEME3 I% _* z! u# m4 [! x8 ?
- .INCLUDE "data/music/Raf World/config.asm"
L; _6 m5 y" S7 d - .ENDIF
! o2 k8 |$ b( ^3 O" v b! _3 v% U -
5 K! f% X6 m0 J* @1 ]0 R - .IF 2 = MUSIC_THEME & u. f" i' Y E. J$ }# X
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
6 c% U7 H/ q' t/ i - .ENDIF/ V+ S3 g9 P1 b. A
- $ S- r7 I" l* A0 W R
- ;======================================================================1 r) Q/ h. A& D/ c1 f, c% P
- ;引用CHR图像数据
3 Y$ E4 e" f; T! o+ o# N W" k0 R - .BANK NES_16KB_PRG_SIZE * 2
- B! g! A: {2 j- y5 O - .ORG $00004 r- b6 ?8 d3 A d: ~9 ^: O' V
- .INCBIN "data/bkg.chr". Q1 B' |* c$ o* h1 v
- .INCBIN "data/sp.chr"
, B8 N, _# D+ [" A! T/ Y6 l: K -
. i& |! \$ ^( y6 a T/ J - ;======================================================================! l, R5 k7 ]) X9 P+ ^: k+ f7 @( u
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
- @. U- `2 s1 o4 i - .ORG RESET_ADDR! T$ o: O" _0 _, H/ ~
- ;======================================================================
, w! W2 f" b! I5 [: } - ;引用其他源文件" H& f( f6 F, K" t. c
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ b! f: S7 C4 k5 L8 c! P
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
! m9 ]% B- B3 g V; S1 f - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理$ H; m: i0 f4 e2 i {$ _
- ;======================================================================
* v) @1 C7 E/ i
- K5 m$ q: P! n$ W* ~1 k- ;====================================================================== I# j$ G0 E$ \" a
- ;等待VBlank到来
! V+ g) s0 `) Y- f% ^ - Wait_For_VBlank" N1 ?/ L8 m, p% J, E
- LDA PPU_STATUS
) [' U- P8 k& I - BPL Wait_For_VBlank& \, m' d; ^, i3 B* O
- RTS
" {- ^# |$ K1 J5 p# [( S
! a$ ]- ?8 s$ Q1 v, ?5 W& m0 e1 X$ H4 W- ;======================================================================5 V3 a8 D+ u! E: a+ T
- ;调色板初始化
% p) l1 H( B) O8 c" m - Palette_Init
3 ^. b! ]7 q) n# k: y - LDA #$3F2 t" o* o0 X7 F1 `: D
- STA PPU_ADDRESS& Q ], A$ L" U/ O- i
- LDA #$00* z9 p& l' |" N
- STA PPU_ADDRESS
0 t3 o: P8 _5 \8 q- W- M - LDX #$00# [/ u0 n+ S& w
- LDY #$208 M2 N! H: S6 z0 Z
- .Write_Data
2 Q3 _ B5 m3 ^/ ~8 j. ^ - LDA Palette_Data,X: z0 ?9 f! y& Y5 g7 G: K* L' c
- STA FC_PPU_Pal_Addr,X& l' ^6 O6 }! M% Q+ C
- INX# L8 f! z% J5 U$ G6 Q* X7 v
- DEY
" l1 k0 j: g% ^; ^8 O$ ~5 e - BNE .Write_Data$ y5 q7 K! }# `. J c! U2 H% F7 O5 e
- .End
! I( a( E, M2 z0 r - RTS5 ?- M' _9 `! o5 }% v# X
0 j. }+ p4 w6 j( T- ;----------------------------------------
! T0 P, F- w2 T, b - ;调色板数据
9 R* t7 G5 ?* Z. x* C; w5 d7 n) Q/ ? - Palette_Data3 P$ m1 N7 s0 _ J
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B. x& |( {2 q" H' y1 M7 q
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
8 F. V! X- f' Z7 A/ y* j. g -
1 X: G5 }8 T! G% N" J3 u - ;======================================================================8 ^8 @; K: a; ?; }0 D( }
- ;命名表清空
/ t/ ^; ]( I4 @0 N' k2 W( \ - Nametable_Clear
/ D1 t3 O+ ~* ]; r8 n - LDA #$20! {* {' ~# s: h) [3 c5 @
- STA PPU_ADDRESS
: h% e5 S, ?" c; B0 l% F* K/ b - LDA #$00
# Q L( e% g& j5 B - STA PPU_ADDRESS
, _9 X# I( Y9 F2 T6 Q' _3 N - LDA #$00* i. R. Z3 G. W5 F' k" B
- LDX #$00
, S5 X2 J6 [1 v. M' x, d" @ - LDY #$08 A0 ?! t6 V3 W+ h" V3 D$ m
- .Write_Data
) d7 `" S' S" O |* o& y4 d. J - STA PPU_DATA
7 C/ Q) `. a# ?, N - INX* _- X9 Z! f! I7 z, ]& @5 b( q
- BNE .Write_Data
8 D' _6 G( B3 t6 ~ - DEY4 I _: i" s9 c
- BNE .Write_Data
% J+ T3 T! F' s3 m6 n' m2 Q - .End
1 P) N' X. d+ m+ a8 h - RTS7 ~. H; h f6 [, A- e- J% O, }3 a
- 5 z# E. j1 R7 n# C
- ;======================================================================. E" H2 O0 C2 U! n R0 q4 i/ x
- ;音乐曲目切换9 o% P6 S- {' g4 V- H2 K k8 u
- Music_Select_Process* ]' S8 c7 @) @) p9 z
3 i" X7 n. K% t2 h- l7 S- .Pre_Music;上一曲1 k% w1 v3 K% a
- LDA FC_Gamepad_Once; I8 q* M. q9 W2 e! @
- CMP #JOY_KEY_LEFT, q. w- c- M& L, Y- E/ }
- BNE .Next_Music9 W' a& E d7 A% z
- JSR Music_Play_Pre
- c' X7 D& @, |- b( D - .Next_Music;下一曲4 U3 ~- [# u6 s) r- g% x+ w
- LDA FC_Gamepad_Once
3 R2 _4 M* w) _- B - CMP #JOY_KEY_RIGHT
" {, }) O {" M - BNE .Next_10_Music
1 B, }7 x s& B6 n - JSR Music_Play_Next
( X2 h# B0 ?4 u0 Y2 d5 | - .Next_10_Music;上10曲
% J7 W! M4 Q3 E8 p - LDA FC_Gamepad_Once
' m9 a8 t* n' j$ z5 ?- R t - CMP #JOY_KEY_UP3 @' t1 x$ [) q7 N
- BNE .Pre_10_Music
8 a& T% J3 M1 f* c - JSR Music_Play_Next_10
3 `+ t( Q3 L5 t - .Pre_10_Music;下10曲
J \; a6 y0 c& X* W: r; N- R - LDA FC_Gamepad_Once5 L( o, Q9 a" u0 n
- CMP #JOY_KEY_DOWN
* C: g( N* _+ B- _- N& f- ^ - BNE .Reset: C! O4 j. S2 y# b( ^5 ?# m
- JSR Music_Play_Pre_10- }. a2 T8 }( f/ j/ [* M% S
- .Reset;重播当前曲目7 ^% T- R9 c$ y ]: e5 e
- LDA FC_Gamepad_Once; V9 }' N( q1 [
- CMP #JOY_KEY_START
. b7 s# x. d2 X+ J* ` - BNE .End
! y6 \1 V- s6 M - LDA FC_Music_Index
$ k. Y5 B/ P; k+ y - JSR Music_Init_Process
* _0 r3 T2 v; i( q2 N2 C - .End
6 Y3 I, m4 }/ k9 i9 { - RTS
! L. z. W; z" D1 S5 \# \ E) u* b* Z
( U3 m' F* Q; @9 _" T" F- ;----------------------------------------------------------------------
4 n' q+ Y' i1 B, t5 i3 r5 c - ;播放上一曲; T' U8 c2 I" A/ l
- Music_Play_Pre
0 ^5 i2 C" ~9 E% x4 T8 H2 j - LDA FC_Music_Index
: s' ] E$ L- f& S - BEQ .End7 G5 f5 M4 h6 X
- DEC FC_Music_Index( B: O; G/ h' S, C# r4 E8 w
- LDA FC_Music_Index7 _: g1 M6 G+ r1 r) ^
- JSR Music_Init_Process* V9 a; m: u+ l# w% z. }7 b
- .End+ \4 N+ k _4 N0 J% \% z( l
- RTS, c0 G/ W' C( o4 i9 w7 y2 W
- ;----------------------------------------------------------------------& b+ U( G# v6 w2 p
- ;播放下一曲+ y f* ` y7 F8 U9 p; O% G" D
- Music_Play_Next
% y6 O1 y6 a D8 Q/ U8 E - LDA FC_Music_Index
6 ]) |3 A% y8 q: \ {4 V - CMP FC_Music_Max_Index( _' ]; I- B8 b$ A' P) M" D; z( |
- BCS .End
4 }( ]2 d5 d% r4 I* z - INC FC_Music_Index5 q3 G( }0 R2 S; C2 `
- LDA FC_Music_Index) `/ @ @+ w7 k3 Q6 s
- JSR Music_Init_Process" f3 A' A. j9 [3 Q4 R0 z8 w
- .End
: y# o7 |; g! g - RTS6 p- T$ q( [9 R9 O
- % q1 x% w) e+ p* J
- ;----------------------------------------------------------------------7 g0 f, R" x6 D% U3 b! \# p3 t
- ;播放上10曲) [! V: L) T1 n% x
- Music_Play_Pre_10
6 m. A7 _9 f" n- j - LDA FC_Music_Index
' ?; T8 V& l) i: t - BEQ .End$ R" K6 a9 b9 v+ @
- SEC9 Y g1 r1 f o1 @" k" }7 t
- SBC #100 z* R( G, Q* P9 t# m" B
- BCS .Pre_10
3 x+ v, G/ B, U) { - LDA #$00
4 @; L' l+ z% O2 S/ c2 z - .Pre_10
* O$ q6 B! @. R' Y2 { - STA FC_Music_Index: o5 Y4 w# ~7 T3 `
- JSR Music_Init_Process
* h" B+ ^1 k( o0 `3 V - .End4 a6 D; l' @4 ?+ t
- RTS
6 O- c+ G9 k$ r8 V+ A. a - ;----------------------------------------------------------------------
. M$ c" [( z* v" j5 F: O9 V2 t5 o - ;播放下10曲
6 z9 _. c% \7 ~1 r9 { - Music_Play_Next_10
9 l$ A$ w" @2 J f% H - LDA FC_Music_Index8 ]- q+ ~1 a ]2 I( n
- CMP FC_Music_Max_Index0 Q, Y- o# ?/ e! x6 [9 W( Y& M# D
- BCS .End
: {7 f% B2 m- A6 V8 { - CLC
* F* b7 H% B. m7 }( j2 g. L0 n - ADC #10
: X) p. |: E% h# G8 Z4 h - CMP FC_Music_Max_Index
- O3 v3 S: ? ~! ]. F# @ - BCC .Next_10
/ F% M/ m4 }! `6 ]" t7 u - LDA FC_Music_Max_Index
9 l2 r2 O9 N7 T. \' t - .Next_10. N; b9 B7 x3 C9 h% b8 x" P a
- STA FC_Music_Index' |& e! O1 o+ ^# r. c2 K- k
- JSR Music_Init_Process
0 r1 t& n6 a5 P; n6 P- I* U8 l - .End
6 y1 b* D3 x4 N0 l - RTS
! E& l4 i8 m4 y% h; ]4 b
' J7 H8 v( `& H/ `- ;----------------------------------------------------------------------
( d; F1 |2 k. h6 M8 Q6 q - ;8位十六进制转3位十进制制( L; g" y1 H0 M' E f
- Hex8ToDec+ Q% _+ D3 z9 c
- STA FC_Dec_Data_1
* i7 H% i" u2 y: {' K1 k* { - LDA #$00" [' L& S! E) ]6 k8 p
- STA FC_Dec_Data_100, S ], k# f; H! X1 \. F6 G* g
- STA FC_Dec_Data_10
: T& _1 Y+ l+ d8 Y - LDA FC_Dec_Data_1
7 C" L$ J% @$ T* C - .Convert_100
! L6 b8 S: t7 q# E2 @4 W - CMP #100
( d4 [6 v6 v$ e2 L - BCC .Convert_10
! ~: f( q) C' f+ f- d0 Q" | - SEC
+ ?4 k3 e! J9 _! r- J - SBC #1006 s1 G9 K R$ K
- INC FC_Dec_Data_100
3 V5 B8 _% _( M$ U# a, ]6 F - BNE .Convert_100
4 V1 e6 e. f: B5 ]4 w8 V6 W - .Convert_10% \1 p' y* Y; l* E
- CMP #104 s, b* D: V: s7 Y
- BCC .End K2 o- H& G" A& V: ^3 m4 U
- SEC
: T" I# P' S( G/ h - SBC #10
0 k% o3 k1 Q/ n' d - INC FC_Dec_Data_101 Q4 ]8 W5 J4 Q8 x: l9 E
- BNE .Convert_100 p( c9 ?: U. c9 I7 o7 f* x6 b4 p! l6 l
- .End
) O9 s' w7 H. f& u% _ - STA FC_Dec_Data_1 T/ Z4 E1 E$ v+ w5 k
- RTS
0 R1 x; X' A- P2 J* T% F4 v# i L
$ h4 V. _% J% k( C4 q; ]- ;----------------------------------------------------------------------, M! \$ R- W F
- ;显示曲目信息, B/ i& }. _5 G! C# R2 L
- Music_Info_Display
( F) c* n( p+ i - LDX FC_PPU_Buf_Count9 M" l2 D' ]) x K _9 S( R
- LDA #PPU_WRITE_MODE_CNT_LINE! ~6 m+ }! h4 O7 c
- STA Use_PPU_Buffer,X/ U8 |2 \2 N# T J* k7 R. p& W
- INX# s, U3 H; |$ m( j
-
( r' a7 o5 x0 B5 C - LDA #>MUSIC_INFO_POS' w) l" b+ ~: o3 Z* U
- STA Use_PPU_Buffer,X
( h5 m, P* D# O6 u0 | A0 m. ^' ? - INX# V3 E: }8 N3 ~' {, K2 @" z8 a
- 1 I+ N! h9 A, y$ s
- ;居中
" \ I( O; M$ C$ q+ | - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
i' ?9 o; c% a0 J* b, u$ ] - STA Use_PPU_Buffer,X; V+ u2 W% s4 Q8 m' c
- INX
. T; w$ H& J! v s* I0 v" B - & A. }' k$ g0 C6 i1 O% p8 {
- LDA #$05' |* {2 v/ D$ m( s5 R
- STA Use_PPU_Buffer,X$ ~) T' v' o# I6 p, M5 I
- INX" e& Y$ P& f& D1 H8 w
- / L1 R3 V- W% |1 c- K- C
- LDA FC_Music_Index% w$ \) k- X9 P3 k) K& }! i7 A
- CLC
; {1 v8 v" r5 c; _ - ADC #$01
( w5 {; u8 h3 Q; K' g: v3 F - JSR Hex8ToDec5 ^0 @$ }9 T1 F% l8 k8 B8 |& Q( |
-
. l& }) T9 w$ \4 @0 D2 L: L1 t - LDA FC_Dec_Data_10! V2 F$ q! x* q/ _2 f
- CLC
+ ]$ t" ]6 ~, i - ADC #'0'$ w$ W$ b# T, Q9 s m! s. z
- STA Use_PPU_Buffer,X& Z1 h1 k( [4 z: d. B/ r- j$ u
- INX
- h! }0 w, N3 `, }$ b1 O5 e -
1 A( d. B5 O: }9 L7 Z* N& \ K: P2 @ T - LDA FC_Dec_Data_1
$ e/ ?) ^! j( p R& q - CLC
9 H- f4 j0 P0 {3 n/ q4 o2 ]: F - ADC #'0'5 l! p" }; [( J" M4 a, j A
- STA Use_PPU_Buffer,X+ D% X/ Y h- k& l q# e( F* V
- INX
6 X& ?3 `2 S" V3 |. P - 9 J9 J' A$ F ]1 G
- LDA #'/'( ~% ?4 E$ ^- Z5 Z9 e) G
- STA Use_PPU_Buffer,X! E% I G+ o* x) |6 p; ~2 M4 @
- INX
7 W$ h. K" y* @% Y; N; P1 E; P -
" J" I' c- I+ {6 Z - LDA FC_Music_Max_Index
3 }. I3 l7 y# S - CLC
7 x4 Y+ k3 S# A+ l2 J- Z; z - ADC #$01( R! o( y3 |2 a7 y: v
- JSR Hex8ToDec0 j7 B; p3 W0 }( |
-
0 f/ J, Z x- e. n1 j' ~ - LDA FC_Dec_Data_10
N1 d/ ]6 R, i - CLC
& x. a, D; ?8 ]8 s- k) t: x3 A - ADC #'0'
) A w7 {$ h& J/ H - STA Use_PPU_Buffer,X/ M6 c6 L' Z" z) L( \2 x! i$ Y+ D
- INX! q, y1 Z: I2 v% V
- ! O8 ?8 [/ w7 h
- LDA FC_Dec_Data_1
/ P7 u/ h! o7 g2 z - CLC9 d/ q9 }( l4 ~9 T& a
- ADC #'0'
. f( M! B# }' e; ]8 W - STA Use_PPU_Buffer,X
! r8 [1 D4 }5 C) B% G - INX3 k6 k, C: K* J$ X! g n2 J; d0 x
- 9 L. v/ W* y8 l/ Q) q+ h5 c; z1 y
- .End, F3 K2 U6 U: [# b' `. j3 F
- STX FC_PPU_Buf_Count9 u2 V! P- Y8 W" _ U; V0 G+ A, L
- RTS- g8 {( o9 [0 [2 i' @2 t! |! Z. a9 E
9 G% y& y/ m6 V1 d3 k8 j- ;----------------------------------------------------------------------
W( \) P& }" ]5 h) Y9 [+ [ - ;音乐曲目初始化处理* }9 [: D: y/ \8 [; P/ u; D
- Music_Init_Process
) Q+ b7 x& E4 `$ Y( z0 w- t* h - PHA# ?/ Q$ q1 J3 D) V" z
- JSR Music_Clear_Process0 v" I8 Q8 ` f
- LDA #$1F. }0 F. J/ m5 l# q
- STA $4015
5 d% ^# l! E1 [6 f! d( N2 B - PLA5 [' p: ^2 x- Z3 a, f
- JSR Music_Init_Addr: l; o4 {5 M6 m3 L5 [
- JSR Music_Info_Display
9 B$ q8 B) }+ j4 R, J - RTS
4 r* m! s$ q5 J' i/ R- g
3 H% k: j6 U# k- ;----------------------------------------------------------------------- m: N' k" F/ ^0 X% A g' o- ?- f& d
- ;音乐播放处理
( A7 X4 @/ U3 I: k( j# j- K, { - Music_Play_Process
+ D8 Y+ U( G% M# v) D& g - JSR Music_Play_Addr& V2 C1 B6 s& t( K' }# E4 `2 g! u8 H
- RTS: {. L: K2 Q7 @: T# W4 U' a9 P# a
4 w6 r8 p) T G) c: ^- ;----------------------------------------------------------------------
) c: K" f: X5 C6 b% o" _* ` - ;音乐播放处理( g/ M5 w0 |- R( ^ N. b
- Music_Clear_Process9 U$ G1 z+ G- D$ k& F: ~% t; m- z
- .IF Music_Clear_Addr
+ }8 T$ x1 I! Z* j - JSR Music_Clear_Addr" o7 U( l- c9 k D
- RTS w* P. n5 S$ T8 m
- .ELSE
2 |( k0 M0 V+ `$ P0 V f" G - LDA #$1F
. i' z* ?3 ?$ K. M# b+ x - STA $4015. m. `. D/ m, j" I
- LDA #$009 r4 e5 i; w; b/ ]5 O! _9 I
- STA $4010
+ i- ~% W# V5 h8 z v - LDX #$000 d0 F* m/ J' T4 P* P' ~
- LDA #$003 a$ x2 n. y, ~
- ) W% ^# C4 p( w, Y8 Q
- .Music_Clear_Zreo_Page_0
' V: b! X& E; }; L - STA $00,X D( v; q$ Y7 e. R" h' O
- INX
. }" H- J" m. a6 x/ V1 V" G5 j - CPX #Use_Zero_Page_Begin5 u m7 w3 e! ^; o0 F
- BCC .Music_Clear_Zreo_Page_0
% K) k& V, e- J5 j2 X7 l3 {* O -
' _# b! o% I6 V - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
9 ?6 X" J% g* m* K+ s0 ~% l S; r - .Music_Clear_Zreo_Page_1! u4 D+ G* M) e' e' H; `
- STA $00,X: B9 `' E- ^ d( K% K4 [9 y8 ^' ^
- INX2 T4 S$ ^9 U- h; D, R
- BNE .Music_Clear_Zreo_Page_13 r8 k6 h0 I" @0 t5 R
- 9 |; D8 R. w7 a+ {2 T
- Music_Clear_Process_10 N' O. ^/ P' t3 L3 m9 O
- STA $0600,X! |; l1 ]% s4 U
- STA $0700,X
/ g n( ^9 r; d6 w - INX3 m0 u3 h/ V5 i9 J8 r( B
- BNE Music_Clear_Process_1; ], a5 e' S5 F- s1 l1 t' [! o
- LDA #$10
/ q' ~6 T6 m! I* V* a. H: p. B - STA $4000
" J, B' S2 c/ {. J) l' n - STA $4004; A% ]- {+ v( f, }: B9 S: `
- STA $400C& Q, X) \/ p: ^8 I5 Z
- LDA #$00
6 d0 x/ i) `2 g9 Y8 a9 ] - STA $4008; @4 @- e( L% F- V0 S
- LDA #$0F' E+ K! k0 u# Q3 x
- STA $4015* H8 M% n J" d4 P
- .ENDIF
2 U8 P( P1 Z7 g9 Q - # `1 e+ ~- c* }: M/ t" g1 T4 q- M# Q
- RTS
) Z) e5 h' L1 S. v9 k. v. Z - % k$ {! {- [! r$ D; t- w
- ;======================================================================% ]9 _6 d r! y/ F( {. e3 z4 d
- ;重启处理* O& ^) ]+ z: j
- Reset_Program
. A0 i% }) s9 _, e7 I% z+ m - SEI
/ n+ t/ K# t- N! u w& M - CLD6 ]8 a) U9 G/ l& f9 M4 r
- LDA #$00. t" ~. U$ @, b
- STA PPU_CTRL
8 L1 ]8 x s/ {6 w# R+ k1 w - STA PPU_MASK
3 Z m! O6 R: k* U - STA JOY2_FRAME0 C" W- d5 d6 S
- STA APU_STATUS) W8 J4 M$ }. T
-
. X" ~. C: m/ A' A. [6 v/ E - ;等待屏幕准备完毕8 f( A3 A- G* ^$ U4 k; f
- LDX #$02/ d2 _1 L* u3 Z, h, g1 | C
- .Wait_For_Screen_Ready/ R4 z8 n1 F4 c6 }8 } C
- LDA PPU_STATUS; b# n' }1 w4 _! E
- BPL .Wait_For_Screen_Ready/ q! n5 c# j& j* o% K
- DEX
9 l- z& j% A$ f* @8 F - BNE .Wait_For_Screen_Ready
$ ?9 H* x4 B' A -
+ h( q7 E) X4 t, F" \4 ]2 v& p( v$ S - ;清空调色板
' L" S9 z+ b3 T' B# d( _ - Palette_Clear
; I1 r: a6 w. o+ `! m, E5 M - LDA #$3F
L7 [& _$ H$ _- T - STA PPU_ADDRESS
( g* z, V) t; A0 `9 w( H - LDA #$00
1 {( h) `/ X( X& [0 u - STA PPU_ADDRESS% ]( ~' x {; Y7 k: `4 r
- LDX #$205 P9 t) K! A) x+ P0 O+ x
- LDA #$0F& R3 @( e; u5 l" T$ z. P k0 C
- .Write_Data
1 c% q2 R& f8 d0 ? u3 r - STA PPU_DATA9 V3 t' Q( K" l$ b
- DEX
* e/ \1 X, M/ W - BNE .Write_Data( U, u. w# g# d4 K# a) s; X0 ]8 e% x
& S A# ~' K2 Q: t0 x8 c, Q& j- ;清除声音 $4000-4013' I2 q1 H" N. e& F$ d
- LDY #$148 p/ d9 Q S3 [/ Z4 S4 T, S
- LDX #$00
$ ]" M, Y0 _4 u p8 |& f5 Q - .Sound_Clear; Y1 H4 J$ I7 o! _! C
- STA $4000,X
* T2 e8 y: B% y5 q8 ]- a! u - INX) E9 u- D8 H! [. A; M
- DEY
2 |" Z% W8 h3 K$ ^" r# U# J! X - BNE .Sound_Clear! o( E# e$ M" r
- 3 O/ m/ n3 i# C; m
- ;清除 RAM $0000-07FF
4 n& a0 \" ]1 G7 L# u1 D# u1 \ - LDA #$00 j* K, w7 O H8 H
- STA $00
+ h3 u7 o( U4 [' S( w - STA $013 u7 c! d2 V6 p' x! J! r
- TAY% ^- Q# s1 k4 z* F! K; j* K
- LDX #$08
( c' q! @" P! f6 _; R$ T) ?% J - .Memory_Clear. R( {/ R# X1 e$ \6 \' o/ e
- STA [$00],Y
9 X) M' E$ S. X( n8 h0 D+ L8 a - INY4 Z2 a0 w/ }1 \! ^, e; e
- BNE .Memory_Clear
$ ]2 C+ a' e2 @7 l8 n/ l' s5 d - INC $01
y; x" V. b, G0 ^0 w; I+ Q, P: q4 K - DEX) b; W( C6 e; @) n5 C
- BNE .Memory_Clear2 `' O! C- B3 {" h' O
-
6 _0 Q+ w! G1 t8 h' ]- s! \- K4 ^4 R0 l - ;精灵缓冲初始化$ }% B- v) R& s% {- e
- LDX #$009 z7 f8 L" x" `8 {6 B% P0 |! E
- LDA #$F8
+ ?3 p7 b3 x% j- m - .OAM_Clear
9 s2 V+ F6 D( M& c - STA OAM_DMA_Buffer,X) R/ P6 \& m3 x- v
- INX
& Q" K! { N G! [ - BNE .OAM_Clear% ?# ]$ g# p+ g) ]$ x
-
& d1 O5 |9 d' Q/ S7 G - ;栈指针初始化
6 E7 t; I& I1 X |" g2 p+ x$ ^% r - LDX #$FF
3 E! [* |& L( `3 |5 @) q - TXS# u7 M' L6 ?4 | B! z) m
-
" ~9 i& N7 z0 Z& S$ J. T# r5 d; t' L0 e - JSR Nametable_Clear;命名表清空, j& O$ g+ [% J. a0 v1 k
- JSR Palette_Init;初始化调色板缓冲
* w% u& L% \! Y B! B - JSR Static_Text_Init;初始化静态文本
! ~; a4 y$ u! Q7 M% j- U& B - + M" }8 b5 s! F0 B. C
- LDA #MUSIC_ITEM_TOTAL - 1) p6 ]/ U2 R! L) w+ k" y g
- STA FC_Music_Max_Index/ g% J# b2 Y3 {. P0 K2 V
- & ]% E1 S6 ? J. K& t
- LDA #$1F, r5 X& t4 l6 ~, w
- STA APU_STATUS
, n* J( U2 \0 g6 Y" i* W9 I - LDA #MUSIC_BGM - 11 `. b( @( g9 ^& w: h$ I
- STA FC_Music_Index
! H' n: A* Z- l* \: q4 | - JSR Music_Init_Process;音乐播放! ?+ r4 g+ L% {
-
^2 Y Z9 G& Z/ X* ^ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)2 T2 B! W* @$ ]* V& [, y1 i
- LDA #$1E2 Y% y$ l- z ?6 z1 f7 X% K6 {' p
- STA FC_PPU_Mask_Buf) a- `* d# G$ ~& F" G
- ; g' H: p# n$ r: @2 R+ H: o
- ;启用NMI处理- g) r# a! U# C
- LDA #$802 n- R7 B) \2 O0 Z3 F2 |5 o
- STA PPU_CTRL; h& k% i+ J& Z6 ~/ P4 U
-
. h+ @- X b+ v& J, ?) [ - ;程序循环, 剩余工作交给 NMI 中断处理# l% {. r8 n; w7 M4 e
- .Loop# t( b6 E! y( V5 ~- J
- JMP .Loop
# X0 Y z# `* ~& F# W. W - ' v% K/ c! C9 h, H2 ~
- ;======================================================================/ T3 x3 z0 `0 C2 J4 i8 Y
- ;不可屏蔽中断处理2 Z( x6 {0 d [ t
- Nmi_Program! Q* I& B7 J! `8 G+ b$ |) f7 I7 b
- PHA# I* g5 q2 I% k- ]* U2 h
- TXA5 m! ]2 a, Q: o- A7 p
- PHA: v5 b y8 U2 W
- TYA
' r: W! W' n! C0 p - PHA
, ]7 u( S% D* p# j -
7 p9 s! a( x }! p- ~ ]8 [- D - LDA PPU_STATUS;读取使得 PPU状态寄存器复位2 B& A7 B4 f4 A; w! T
-
' U; l0 S& L r8 \( Q D% m - JSR FC_PPU_Procrss;PPU处理
3 o; S. K, M" b -
! U0 K) M# ~. q - ;精灵内存更新
6 T( P# L7 q1 W+ d( ` - LDA #$00
$ `& Q- X5 ?* l( L; Y$ n% X$ |) M - STA PPU_OAM_ADDR* L* X& J" Q' o! j8 s" m, u6 }* `
- LDA #OAM_DMA_Buffer / $01002 O* z+ i+ c, k' Q: v
- STA OAM_DMA1 G" k/ @. W4 v
-
5 d5 A2 |5 G3 U- L; x - JSR FC_Gamepad_Process;手柄输入处理
2 ^+ [! L, H1 b" F8 ?% ^0 ~ - JSR Music_Select_Process;音乐选曲处理
# M1 M, n8 H2 f - JSR Music_Play_Process;音乐播放处理
: E, l( @& \- x4 o" w% }' A# G; b - ( \. d- r1 `! k+ ^) H. t
- PLA; X% ^$ }7 D9 A- Z6 q* H
- TAY: I2 R% F3 `- e5 E: o
- PLA
, ~8 ]* O- v$ y" ~ - TAX
5 Y1 F1 u8 `+ g9 d8 a - PLA& p& C" m+ x& m# V% T
. e2 I' b! d: F5 w- RTI
0 i) J! @( B" N% }
, ]: R& O5 k: ~3 e: ~- ;====================================================================== l! r! x- ? ]$ _3 k
- ;请求中断处理
2 i; g' q* C# A/ y5 C0 T! F - Irq_Program O& R# F2 \+ l/ Q: C
- RTI- C' K+ ^$ ^" d. S% l9 a
- N6 J6 H. a. N- ;======================================================================
, p% v" U$ s( W& U- Z/ j* u2 H - ;中断向量表
; g8 G( N6 V7 c9 H - .ORG $FFFA
8 P+ W' Z$ p: d: ~7 \9 _4 ? - .DW Nmi_Program ;NMI触发时执行+ Q! r0 u3 V9 q+ q, L# e8 c
- .DW Reset_Program ;载入ROM时最先执行
X7 a' L, b* r- i$ G" x7 S - .DW Irq_Program ;IRQ触发时执行; o0 w' G m) s1 q5 N$ q
复制代码 ' L' R' _0 G# U' {! z0 A( \
2 \! q" R @: |/ k4 O
Y% S2 w2 P1 p" M/ p3 x$ zhttps://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|