|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下6 D j2 l7 A' g

( M m" I0 r+ L4 h+ F0 Z以下是主框架代码:9 M6 ^# R# ]' t' }, C& U. W) a3 \0 V
- ;======================================================================
, U0 t- @ _, v# ]. B* ? - ;文件头: ?2 y5 Y# A8 e
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量7 w0 n f8 o' p) l; j
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量& u* M/ w H( d/ [6 Z9 [
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
) [' X+ H! o0 C9 E - ;======================================================================
2 j' s' M" Y/ Y6 m) U, H! s3 J - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
& ^+ T( Y5 O6 N; x - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
4 V- `. d! E- E% j - ;======================================================================" E7 ?% U6 H& B! j6 j! A
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
$ J. Z/ Y& t3 Q' S! R+ ?$ o - RESET_ADDR = $E000 ;主程序起始地址
& ]8 k, n2 X* J8 j - ;======================================================================- _7 T' E2 q2 n. w- D a$ s( g, Q$ C! N
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB) a: e+ u; O. p0 m5 c
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB/ x+ |3 L t/ o2 v& v' V6 v( s
- .INESMAP 4 ;Mapper号 (0-4095)
. q* c' {' @2 i: @9 a - .INESSUBMAP 0 ;子Mapper号 (0-15)
; r0 o9 o; n/ U- f' l2 n+ X& k; B - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
9 j. l) o3 }" W9 o* M' A: P - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
. \0 V! P3 E( V& K9 A - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
( d" {( `5 ~1 _( D# J/ _ - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
]# m% E* `7 d9 G3 I - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
6 k5 N2 `) F7 A! D - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)) N! d; w! T. f0 {
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
+ p2 M4 [$ ?2 w% X) v% l" M7 r! W. _ - ;======================================================================0 r5 c {- s* h* ?6 ^7 N/ }
- .INCLUDE "fc_demo_config.asm" ;全局配置
; ^: m5 m3 R h( L# U - .INCLUDE "fc_demo_constant.asm" ;NES常量
3 b9 B( |. }3 V' y- h - ;======================================================================
3 F5 z3 M0 J+ P0 ?: P. \ - ;音乐配置( ]: g2 E4 L7 Q: ?* A( [' G( P% A
- .IF 0 = MUSIC_THEME
5 {* f4 |: K6 o- A5 B - .INCLUDE "data/music/Gremlin 2/config.asm"& w9 ^4 ~. `' V/ h
- .ENDIF8 ]6 l% w3 X5 x
-
3 _; F; _0 w$ A) z2 N: w - .IF 1 = MUSIC_THEME' Z. i" o* ?+ g4 X
- .INCLUDE "data/music/Raf World/config.asm"
1 L0 R: s. S6 O/ s - .ENDIF( E l. m9 G& } G
- + p- L, W. C" ~5 T
- .IF 2 = MUSIC_THEME 1 p% N4 V5 K9 Z( I& M5 s" V
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"3 G/ `* W5 J! X& t8 j
- .ENDIF
1 z: |/ q: M4 A& t - 3 q8 P7 ~* j3 e) g1 r2 `
- ;======================================================================5 K( F/ v* w. x3 {2 J, R3 |& e
- ;引用CHR图像数据
+ |: e( O3 b$ ]- z1 E - .BANK NES_16KB_PRG_SIZE * 2" [9 Y$ R# J% D% r. G4 {2 b
- .ORG $0000: _ g* m' M6 h* o- k8 p
- .INCBIN "data/bkg.chr"7 s Z' z( e) \6 G2 l$ o) s0 k" m
- .INCBIN "data/sp.chr"
+ ^( c' Z. l5 h# m' y4 T2 A -
/ q% F8 s. b3 E2 s7 o - ;======================================================================6 j( M r9 K0 \2 y. r) }. y
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
. h, S3 _3 V- N - .ORG RESET_ADDR
; `% }0 n% N7 ?# I6 |2 j( W) A2 e - ;======================================================================
3 K V/ E* C3 N" m - ;引用其他源文件
2 L/ x2 E. k% R8 r* B$ @ - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
: O2 Y0 H" \5 m. y. d - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
- m3 `8 l' r& M - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理4 `# @7 O5 P1 N! Y) k/ F
- ;======================================================================6 Q# U4 c& u$ M* \3 p
# I, l# e( B' I/ F1 N$ V- ;======================================================================
" [5 l) y1 ~. ^; b6 G- A - ;等待VBlank到来
0 ?! L1 S/ A$ l0 U - Wait_For_VBlank) M6 i! X' E E! B* v: d2 R+ \
- LDA PPU_STATUS* K1 |( |0 q9 c" t T' O! X- W" c
- BPL Wait_For_VBlank$ Q$ v2 Q: U) i E4 K+ c% s
- RTS
+ v- x0 M1 I8 z+ j' x( B; t
l$ w2 e6 o$ G9 P- ;======================================================================3 t* U6 g v& y
- ;调色板初始化
( g5 g& {+ b* D - Palette_Init
( j* d# {+ a5 r7 J, t, c2 b - LDA #$3F
' v! P; b( |6 s+ K. j8 { - STA PPU_ADDRESS3 ^8 p) A7 M& R2 S
- LDA #$007 [1 l# \" o* F% t6 K/ d% I
- STA PPU_ADDRESS: t( I+ O# e3 F1 Q ^+ G' x) _" z
- LDX #$00
8 _3 Q( a0 t+ a0 E - LDY #$20
& n; S. B" a/ L* l j# E - .Write_Data
/ f- M% ~& g/ Q - LDA Palette_Data,X
" X$ n: Z# k, b0 F! c% q - STA FC_PPU_Pal_Addr,X! O) ]' ?! C, t4 h; V% `* C
- INX
7 z0 m) s+ z+ C7 [7 L& M/ `" O2 i) K - DEY6 z( J0 T# I& t
- BNE .Write_Data7 Q! s. S: J# O3 I) ^
- .End- J9 j3 h& t2 T# v- `+ [2 m2 A
- RTS$ [8 b% Z# {( M3 O% D$ p' V
$ \0 }+ } T7 F+ v3 y6 c3 ~' V- ;----------------------------------------, [5 N, G# j( S& B# P) K3 X
- ;调色板数据
# V$ R4 U. q6 J; E$ [- f4 D( Y, s - Palette_Data
4 ]5 c; v% ?& {& e - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B/ Z9 }5 v' m+ W g* J
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22+ @+ ~4 J0 L- Q8 k# y
-
% @) \7 b; G+ |+ @! b, o - ;======================================================================
1 [" c+ w1 ?( Z - ;命名表清空4 k: d8 F- u9 m h, U
- Nametable_Clear
$ e' U* N- k# w5 {8 p - LDA #$20
, `8 y% U: d" Q G, J - STA PPU_ADDRESS+ P0 A0 l( Y8 Z( q5 R; c) c
- LDA #$00
0 M' \1 A1 l/ U - STA PPU_ADDRESS" S4 o& P) A( p3 \, u
- LDA #$00$ M& a: v; o j; ]! |( r, g
- LDX #$00
* i3 \0 I$ j H" F. z - LDY #$08
! O* y# U9 F9 F! Y2 u! o - .Write_Data
5 T. H9 n [8 Y. z h - STA PPU_DATA
" V* K! x0 D% `' h# Y3 B9 s - INX% W/ k! l% \7 b6 N, I
- BNE .Write_Data) N% y- ^$ b) [: E2 J0 e
- DEY0 d8 L7 ] a1 T; A
- BNE .Write_Data+ [8 b$ R/ u$ V7 V6 ~
- .End. J. G0 W/ m8 k! W \
- RTS
; v, t) W# P6 H! I5 L
: @2 _/ i4 k, D1 O. t7 e+ C- ;======================================================================1 f# B! T7 P) q( T8 t% n p3 {
- ;音乐曲目切换
1 ?3 ?' u9 Z" U1 a: V) N% T - Music_Select_Process
0 c$ k% a7 u2 {; |9 g - $ E( j; a; l8 ?1 x/ s F8 ^
- .Pre_Music;上一曲; \* p; O) g7 _2 O$ A
- LDA FC_Gamepad_Once/ k3 Z r; G' ^8 t
- CMP #JOY_KEY_LEFT
# Q; n1 i4 j/ z! ^ - BNE .Next_Music) s3 P3 O% y) O, a* b; I3 Q( D$ o
- JSR Music_Play_Pre" h+ C- q k( P
- .Next_Music;下一曲
7 }+ ]; @% a- B6 _5 z: i - LDA FC_Gamepad_Once9 ~+ n" U9 {8 m" j( y8 p, k/ J' s0 y1 \
- CMP #JOY_KEY_RIGHT7 h( s7 j" y- S
- BNE .Next_10_Music
( K' h0 f: [' W) ?" c0 [& B" O - JSR Music_Play_Next4 K" s; r+ h% p* \' h8 [& D# t6 @
- .Next_10_Music;上10曲2 t4 x9 J3 i; G) |1 @
- LDA FC_Gamepad_Once |/ d; _# @% h" ^/ M7 M
- CMP #JOY_KEY_UP
3 ]: h2 k8 |% |3 k4 G B - BNE .Pre_10_Music$ c& S1 z ~7 b5 `5 h" e% F9 _
- JSR Music_Play_Next_10
. w/ ^2 s( p4 u* x) b! l5 k$ S9 F - .Pre_10_Music;下10曲3 P4 w1 ?! u5 H8 f
- LDA FC_Gamepad_Once' G; K U" `( s+ q+ v
- CMP #JOY_KEY_DOWN5 Q! F; j2 X: J) a, J4 M
- BNE .Reset& ]/ q7 g6 J: A! B! A+ A" ?9 R' D
- JSR Music_Play_Pre_10' b0 T% M, P4 r( f
- .Reset;重播当前曲目
" {% o5 T R# }$ S4 M7 i& e - LDA FC_Gamepad_Once3 o1 [/ a) ~" o g5 Y) U+ B( }9 V
- CMP #JOY_KEY_START8 J( _6 I- }- k* M- J1 o
- BNE .End* n& U" J2 e5 \# U' W2 y6 A
- LDA FC_Music_Index9 u+ [- H4 _& U: V6 r1 Q9 ^
- JSR Music_Init_Process
1 Z! q* B5 i7 O* l+ R+ ? - .End
5 @3 n, m" b d/ v' E9 E - RTS
* E% C; `, q) z& e7 i( o - ; j9 J0 T( ?$ Y7 V3 h. E! l! `2 i
- ;----------------------------------------------------------------------
+ X2 d+ u) Z% p - ;播放上一曲
1 H! a8 d+ v* E$ J6 t - Music_Play_Pre4 K* q' V. V8 Q$ c L( [( Q
- LDA FC_Music_Index
0 B$ K9 ~, a6 C! C( Z. r" o$ i - BEQ .End
" W$ I0 {% Z7 F% y - DEC FC_Music_Index. o) i$ s9 o3 k8 O) x- |0 N
- LDA FC_Music_Index
+ W, E2 i `9 N$ N7 D - JSR Music_Init_Process
- j0 C, ^ C+ E1 P. y6 K0 f - .End/ u$ t, t% k; F7 o. T2 Z
- RTS
h# O4 f% f5 Q+ n: G$ e1 z' u5 S% j - ;----------------------------------------------------------------------" t' l- p6 A8 x& K
- ;播放下一曲
' ?. N ]( H# r: t# W7 |( R9 A3 t- C - Music_Play_Next
3 w% [' h7 }+ o9 C6 c, `/ ] - LDA FC_Music_Index- C2 A' l" m3 B6 J. ?7 Q3 ~
- CMP FC_Music_Max_Index& {4 ]3 M { p! [, V1 I
- BCS .End
% ^2 x- ~9 i6 E+ T' p1 j* k6 M - INC FC_Music_Index* x- y4 o4 f* i( `0 f2 O6 d0 }) L
- LDA FC_Music_Index6 f$ d7 b5 N! a9 X
- JSR Music_Init_Process- p$ q {. n' ~
- .End" r' ^, n; W% d
- RTS! F& v( J$ Z2 R! i0 b4 A
1 h7 X# K8 Y* b8 Q+ P" o- ;----------------------------------------------------------------------7 u$ @# l2 s) i9 w! { d
- ;播放上10曲
; f3 j( V: Y- u' b' ] - Music_Play_Pre_10
+ n3 P3 j A7 P$ S4 C( w. S9 P - LDA FC_Music_Index, e5 `8 V4 h0 f$ y2 ]( B" _
- BEQ .End* H! a' o1 J. ? a
- SEC c: @7 `- Y+ p" M: I
- SBC #10
. \9 W' w( I6 ]* ~' R( ` - BCS .Pre_10) n! s6 c- ^4 o, ~$ K0 E/ C
- LDA #$00
, l; o3 o7 H* l! o - .Pre_10; y1 T: b; s3 G
- STA FC_Music_Index( W# p' ~0 g7 O8 J
- JSR Music_Init_Process2 n$ O0 v$ Q$ v6 j3 U' |
- .End+ D: i9 }4 O( A1 A1 o
- RTS
: e: s' x% u: [; o - ;----------------------------------------------------------------------
8 |& m- Z+ b5 M- d3 c0 ^! g - ;播放下10曲
1 T3 _* p m% ]' s - Music_Play_Next_105 \9 R" t# q. q. u X
- LDA FC_Music_Index
$ P! g$ u2 \( G# \, M" G. _ u - CMP FC_Music_Max_Index
0 T t) t# G( P - BCS .End" Q' n" L% J' Q4 I5 ^0 S! h
- CLC5 Q# c0 ^: W8 j/ P) b8 b
- ADC #10( E3 T3 _) L; M, t' } m
- CMP FC_Music_Max_Index6 E; ?( Z* D9 U& G. j9 a6 a
- BCC .Next_10$ e( v9 E; E' m' R1 P U
- LDA FC_Music_Max_Index" ^9 M# w }( K
- .Next_10
2 ` \$ \( l. B& x! u% y - STA FC_Music_Index% |7 i X' w! h
- JSR Music_Init_Process% W7 k( \2 t' X5 Q
- .End2 C" q4 Y3 ~4 E
- RTS
( D- J E# E3 x8 x2 E1 K% l - w8 M7 ]1 ?3 Y" M( r4 S
- ;----------------------------------------------------------------------
) }$ S; }2 [) X! Y( s0 ~* `1 R' v ` - ;8位十六进制转3位十进制制8 s0 R, {- U' z; L0 ~
- Hex8ToDec8 J* q! W; @ R- I3 S% q0 L
- STA FC_Dec_Data_1* J: X6 t$ N# I: D
- LDA #$00
" v7 r9 y2 F! z3 M* y! Y - STA FC_Dec_Data_100; M0 [" W4 V6 f5 x/ z S7 A- N5 F
- STA FC_Dec_Data_108 [ [; D4 [. `3 E# B+ { H
- LDA FC_Dec_Data_1$ |7 ]$ I! I% o6 f3 c
- .Convert_100/ a" ]. {, i# R3 ^' k* c4 s9 Q' u
- CMP #1007 L v9 f& ?8 ^# y
- BCC .Convert_10$ Y8 `+ {' C: S* ~. N
- SEC
" f, y- J' ]: C9 N - SBC #100
9 \. o9 w0 t" i7 }/ N$ n- t - INC FC_Dec_Data_100/ @# ?2 z) _/ M* E
- BNE .Convert_100; f9 J% c% \ U# ?
- .Convert_107 M+ o2 P0 ?& X1 X: \9 h3 S0 x
- CMP #10
. W4 g" M" ?8 J, M# I - BCC .End" V( `9 Q6 e! u0 R
- SEC
+ t( `7 I( \0 ], e% }. _- m& ^ - SBC #10
+ k6 g7 Z0 C7 y3 \0 |0 A* P4 T7 A' P - INC FC_Dec_Data_10
( [& M% M6 |" Z% `8 Z& o! R - BNE .Convert_10
0 u0 }7 i2 ?: m; e$ o6 l' m' ~/ c - .End
# N/ L5 S3 O4 s- g: ^9 Z% |' ` - STA FC_Dec_Data_1
; V# p. }. `; n& Q - RTS
3 e; f l& ?" `: l - * e8 D, V/ i& I6 ~+ X3 }) O
- ;----------------------------------------------------------------------
# \, t4 f3 J8 T6 I - ;显示曲目信息+ r4 Y: p$ P* h, t
- Music_Info_Display
/ Q u2 l4 B+ D" N1 { - LDX FC_PPU_Buf_Count
9 k5 u1 a6 h/ N7 ?! D" | r! L. X - LDA #PPU_WRITE_MODE_CNT_LINE) `6 C2 r- }' W `/ w# Y* }
- STA Use_PPU_Buffer,X
2 ~2 ?, q% y6 S8 U - INX
[9 ]5 l4 ~, w1 H7 E' Q -
2 x6 f% a6 _6 [: {% t6 R+ q7 G0 s - LDA #>MUSIC_INFO_POS2 ~+ n: V, X& d/ w. ?7 T8 P1 t
- STA Use_PPU_Buffer,X- ^: \3 z4 \4 Q! O9 G; L
- INX% t4 M" P2 d; h/ k% t
- 1 D$ B7 a6 r% l; |" Q
- ;居中: Q% e k' f/ m: c5 v* L, `+ I
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2; e. K5 q/ ]/ j& t
- STA Use_PPU_Buffer,X
& |% N0 C3 F1 a/ X8 S4 ^- z - INX
3 {# H) ?& U- ~8 y# d -
7 ?9 G0 @4 R# L( } - LDA #$055 I% e0 V c, X
- STA Use_PPU_Buffer,X
8 D9 d) B+ \# I9 ^ - INX1 z. D2 j% Q# H3 R. s6 L
-
5 N; T3 m/ E) k/ }) t - LDA FC_Music_Index
8 l0 N4 c1 }0 n# j# F! a+ G ~ - CLC( Q, H. L r' x2 P/ o" u
- ADC #$01
. G3 u$ |. D0 c7 z8 D Y - JSR Hex8ToDec+ W4 K; X/ N$ M- q% K
-
' C" m) ?$ G' {; o0 L: t# S - LDA FC_Dec_Data_106 n' b! z1 z; X4 g* D% E
- CLC* N! j6 R3 Q, I. E, d* j! ~2 V
- ADC #'0'* O2 o+ R2 j! D3 v$ g0 `1 L
- STA Use_PPU_Buffer,X% D; D: j8 j' u) p# N9 ~
- INX! ?' a# B8 n1 o, w
-
1 e& Z7 I3 |# s7 M' L/ N) J - LDA FC_Dec_Data_1, h" P k5 n7 P& R
- CLC
% p) X( f. I& ^! ~; ]% V/ x# w+ @ - ADC #'0'$ O2 T" j* _* @# d- F; q& n: H5 B6 N/ o
- STA Use_PPU_Buffer,X' b, u* L; Z+ B' a6 l
- INX3 c" R. F! \. e) y
- 8 ~$ _/ U" K( f4 `/ [4 Q
- LDA #'/'
8 q: |. }, T: O) X0 K - STA Use_PPU_Buffer,X
* q% e2 }) m( F - INX
- _; G$ Q, q) F -
5 W! B7 Y% d; P - LDA FC_Music_Max_Index
2 V O2 m: D0 z - CLC
4 i9 f6 `2 U* {5 W5 I - ADC #$01/ ^# A3 r- t# T0 x
- JSR Hex8ToDec
0 `; L8 P% a$ W' D -
* b4 ~0 W) p8 p$ `2 j3 j) B4 G5 ` - LDA FC_Dec_Data_10 J' d1 Q$ F }$ s9 W
- CLC2 ~2 c$ G$ g5 z* h5 D
- ADC #'0'
- x& j# z9 H' G* Z7 z! y - STA Use_PPU_Buffer,X$ d6 [ b' w8 T' d/ O! @' q
- INX
) h$ E5 w; ~. b& w1 D0 Z+ P - 5 ?2 y" D: E y0 m9 D& v
- LDA FC_Dec_Data_15 m! U& E5 A1 C Q6 b
- CLC
( `& u: [, e' G4 B9 X1 q) L - ADC #'0'$ l6 W! I7 ^$ k1 y* ^) ~! S8 c
- STA Use_PPU_Buffer,X& R9 {6 z+ _: o
- INX6 D$ d! j8 E7 U: S5 }: C2 k
- 4 i& J7 ?6 Y$ L
- .End
7 i0 a* t1 W% u) Z8 M - STX FC_PPU_Buf_Count
! W4 v* G h' {2 p" d% q1 X1 B. t - RTS
8 h! }8 W% L* C+ v# F/ P2 H - 7 R- Q8 i: C& j& X% b3 H
- ;----------------------------------------------------------------------5 r9 e( n! p i; m/ R- v' N
- ;音乐曲目初始化处理- r0 o( W, d# s: ?! m, p# }9 R
- Music_Init_Process& [% `: j8 }0 L+ @5 y Q9 T
- PHA
]) q$ }! i$ {+ x& b4 J& ] - JSR Music_Clear_Process% ^$ ^- ^( s' u4 I+ u- T# ?
- LDA #$1F/ Q* |4 u5 u) t5 G4 H; p# q- [+ H. T
- STA $4015- H! `" k/ w* m$ e. `
- PLA$ v9 _6 ^. p7 S9 p: I& s% G
- JSR Music_Init_Addr
8 k' ]3 m& m/ @3 w. K. s1 v - JSR Music_Info_Display0 r" V# T, }: ]" m2 e$ H/ j( E0 u, l
- RTS7 x) O4 \3 }7 S& F7 x! O+ Z
) n% |3 d# v) `- Q% ^- ;----------------------------------------------------------------------
; I& y% s6 W% k - ;音乐播放处理) T& [% q! w4 K
- Music_Play_Process
0 A, `: P. p+ i! j4 a& v - JSR Music_Play_Addr
L& Q( o' I! n" ?( o3 r7 u. } - RTS1 L2 ?( b* t) V% F" L1 V9 |" @
- 6 u4 w/ k* @" ~ G7 B7 {& Y1 J
- ;----------------------------------------------------------------------
3 X( O$ ]1 O- c# b - ;音乐播放处理
" J/ G9 T# f$ ]. J9 h6 i - Music_Clear_Process9 V ~' Q y2 P+ k
- .IF Music_Clear_Addr
) l! g- T0 X, Y2 w5 E3 [ - JSR Music_Clear_Addr8 Y5 `3 h l1 x( t" |% V. B$ H
- RTS
2 i$ ?& ^/ y: Z - .ELSE* P8 S* M3 k: V$ ^* l; Y* w) x0 h
- LDA #$1F
9 h l5 d. A$ r - STA $4015$ k& [: ]" J: F# \* J- a* k
- LDA #$00
* C$ f" \) q8 Y0 T - STA $40104 ]# d" w8 g: Q- g" `& B+ V+ u$ Y
- LDX #$00
|/ }7 a. e t4 m6 J; c - LDA #$00
1 t: ~9 Y8 ~) i7 j0 m8 m& j - 4 E: y" Y* L9 A0 O& o) `# ^
- .Music_Clear_Zreo_Page_0
% J9 Y% O( R# X$ D! f" a: m - STA $00,X& [: X, L" ?2 @* ]6 ~
- INX3 N5 Y+ R* t1 V. {7 {$ k6 T
- CPX #Use_Zero_Page_Begin: O* d6 h+ F- x9 K4 w, R6 i1 ?! T
- BCC .Music_Clear_Zreo_Page_0
1 s, ]* h: p- ^' @7 p - % X" e1 u: K$ n/ Q) T
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size) {9 y. Q! a, m2 l* X) b. Q: ^
- .Music_Clear_Zreo_Page_14 V R: h; {6 p; i
- STA $00,X8 m) ]. p c- {. z
- INX/ m3 K/ s. f2 u
- BNE .Music_Clear_Zreo_Page_1
# J- c" n1 D( X- }; m+ `+ [ -
: Q% b) W5 w% C. Z7 o - Music_Clear_Process_1! d. e" w, X; u- x. c/ P) E
- STA $0600,X
\( H: J+ H/ W+ W( A6 H1 W - STA $0700,X
3 g% _2 F. z9 M2 A - INX. @. A% L8 N" J( R
- BNE Music_Clear_Process_1
( a$ r8 D0 X1 L1 z' @+ l5 F- y$ u - LDA #$10
+ \) ?7 l, V: G! ] - STA $4000) v" a5 d) x% R$ U8 t# i% k
- STA $4004
8 Q5 @" m9 E$ C) {+ a" r* D" u4 u - STA $400C: k4 k& I" G B
- LDA #$00
8 f* x: E2 ?2 [4 h - STA $40088 u; B+ y0 y' P+ v: A1 w% l
- LDA #$0F
0 X3 d8 z' O7 [' r+ Y; A1 f - STA $4015
! Z) S3 Y* b2 l1 W' i/ H3 _ - .ENDIF
1 V- c) X9 ?6 r4 L" E -
# ?! \9 L3 m$ q) s" b8 z - RTS9 l7 |6 B( A; s+ h, A
- $ ` X" R5 c6 ?/ j4 T
- ;======================================================================6 b- C# a+ q, S) U% ?% n
- ;重启处理
9 ? L4 {( _' R. W" x2 F - Reset_Program
- @, V* o3 n- \/ C/ a% C - SEI% y5 O0 l# C* u& }2 e* T
- CLD
2 h# [/ G4 o/ m" z$ u# b - LDA #$00
3 V5 v- J' s j F/ I - STA PPU_CTRL
5 X! F* _; w! q - STA PPU_MASK# _; \$ `2 v y' b/ ]# K
- STA JOY2_FRAME
9 {( j t* E1 B - STA APU_STATUS4 L% L* I2 G% z/ @- b' K* ]/ }
-
8 X9 q# D$ I5 f" W7 o6 d2 [ - ;等待屏幕准备完毕8 I) a+ L e3 C' u
- LDX #$02
4 K0 O$ \! [, s7 z3 o2 L$ \ - .Wait_For_Screen_Ready
: ?5 T4 n: E0 l- A* m7 d - LDA PPU_STATUS
3 c- n$ d. P8 k6 [' ^8 b. P D# @ - BPL .Wait_For_Screen_Ready" c6 f$ k9 M) u
- DEX+ I/ q* Q4 K# U! m/ |: p
- BNE .Wait_For_Screen_Ready9 @ X. f# T, A" r. Z
- # c$ Q! v# s+ q5 o
- ;清空调色板. \; @6 A7 @$ X* W
- Palette_Clear
/ y. j* ?( l, q/ }9 v, v2 [$ y - LDA #$3F
2 P9 M- ^3 Z& C$ }1 T( x - STA PPU_ADDRESS
6 d) c5 a9 t6 }: n - LDA #$00
+ Y+ ^7 t4 ]$ f - STA PPU_ADDRESS. O% E2 ~" a4 t- q* b r6 }
- LDX #$20
) q( T$ e8 b, i - LDA #$0F
, ~! {$ E0 D( W& o - .Write_Data
: j; x$ E5 m3 r) R D9 {8 y2 H - STA PPU_DATA+ R- g9 j- u' j: K5 T
- DEX
6 ~! V5 v' E8 u3 E5 P0 p# H% A - BNE .Write_Data5 r( R% w! e D: n
- 8 C+ r# i) ]8 B" }% T2 z5 l0 c' Y
- ;清除声音 $4000-4013( a" A2 L% h" R! [% p
- LDY #$14
v, A0 a) z8 d- R; A6 R - LDX #$00
$ e$ r1 D4 E9 I* B( O8 H - .Sound_Clear
1 _7 [: L) k7 o7 L, \4 r1 E - STA $4000,X% Y. b; F+ d4 ^4 M( M) t
- INX% U L* j/ l( o
- DEY7 V; g) J. O. ~9 f/ ~' M3 f- [0 v
- BNE .Sound_Clear+ |/ Q% _; r# y6 @+ ]
-
9 l: S6 x. j# |7 _* C - ;清除 RAM $0000-07FF }+ D+ q- X* |8 P" q" V
- LDA #$00% |% j' z" y! Y3 X$ ~) B
- STA $00% Y8 @% ^/ x0 t& h4 l" O/ Z: W
- STA $019 H6 q( @) C+ U. C K- E7 d
- TAY
1 v* q2 H+ G3 B - LDX #$08 |6 u2 c( X4 L. g% {( I% ?3 F
- .Memory_Clear/ }% k; n: k' K8 X9 `
- STA [$00],Y
! @- F+ O; K# g! R) Z; [ - INY
/ ]: W) {6 {1 I4 X" Z& n# S - BNE .Memory_Clear, ^+ @# D* i% W5 q( D
- INC $01
4 K" M# ]( V( E* i5 k* | Z - DEX! q K6 {+ N5 y, L p0 I/ D0 k* P$ o
- BNE .Memory_Clear
( U5 T, X/ }4 B. {* Y/ g - 7 I$ U: K' C1 Y) N
- ;精灵缓冲初始化
% r+ _9 y$ h9 E" ^ - LDX #$00
$ @" t5 W8 V' K6 q& T: ^% h1 ?' J+ ^ - LDA #$F84 ]& k% q" h3 w* |& U
- .OAM_Clear K( r* k8 Y/ L( W# F* \4 D
- STA OAM_DMA_Buffer,X/ ]/ O0 o7 S1 e2 x. U! |3 e b/ j
- INX
( H" s) d7 z2 ]. u; {* f - BNE .OAM_Clear
/ u; @- z% w8 d% }( g. o% [ -
$ T" i- u, P$ X0 O0 m5 M7 \ - ;栈指针初始化
) z; j# t* l5 w$ Z2 J- L% x - LDX #$FF
A# k2 o: n7 U0 L& Z: ~ - TXS; l9 B/ K6 J9 ?" d, M% W8 C. c
-
# [/ f3 O4 A/ g) e1 M& ~ - JSR Nametable_Clear;命名表清空
7 x4 K4 W: u1 ^4 u% r& a - JSR Palette_Init;初始化调色板缓冲
* g# A" P& t. o - JSR Static_Text_Init;初始化静态文本
9 E$ Z4 Y2 m" O- U -
! M- Z; ^& h+ D, l' w A - LDA #MUSIC_ITEM_TOTAL - 1
5 Q9 N) q- p$ r7 x" P" R - STA FC_Music_Max_Index
# K9 g2 b6 U t; U6 M# L3 A: i -
/ L0 U( R; C+ V0 I' N0 J! { - LDA #$1F
! J( H( O2 U5 L/ C$ ^( _ - STA APU_STATUS$ O4 R \* V/ ? N p( _' [
- LDA #MUSIC_BGM - 1
% J; a% t j2 H" U, t - STA FC_Music_Index
6 p7 I$ I& e) F3 B1 k; T - JSR Music_Init_Process;音乐播放
/ p3 A5 T5 N- D* W- t$ H% W -
% H9 v: b' G5 d# q/ ? - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
7 Y9 a4 h, X- Q6 a& w- Y- U+ H - LDA #$1E& {3 r7 W+ s2 F& L( n
- STA FC_PPU_Mask_Buf
4 `- [2 e4 ?! c4 H" O" w -
6 w5 U" B2 y9 T- Y - ;启用NMI处理9 c2 J$ e. c4 d. ]9 ]
- LDA #$80
# D$ a7 e" n4 H - STA PPU_CTRL
; G* p6 H0 v! } - * s4 a7 Y9 Y4 ?
- ;程序循环, 剩余工作交给 NMI 中断处理- ^) a2 E$ x' O% b# D) L$ j
- .Loop
4 W) [* T# Q1 k - JMP .Loop
$ X& W# K/ L: v+ D" M
4 e4 i' c$ A6 S- ;======================================================================' _, x4 A/ O9 Q+ y" f4 \. T' N
- ;不可屏蔽中断处理
7 t" ]8 [# A' P. D( B - Nmi_Program, q5 Z4 V9 I6 |, N3 w
- PHA
- D0 c+ J3 ?( N - TXA! P2 a1 H- W9 o# c/ G) |( M
- PHA
: N5 z k( ^1 ?( d - TYA, D! S8 u5 K" B" {4 P
- PHA
5 O+ N9 ? o7 ~' n6 ~ -
" ~# U/ y+ _# O1 [7 n" P0 r - LDA PPU_STATUS;读取使得 PPU状态寄存器复位6 L3 h ]9 m# W% S7 H
- - G% W+ x; v w' C+ e6 ^1 C( G
- JSR FC_PPU_Procrss;PPU处理
; X+ z. x; g3 i! `' N - . a* T6 O$ d( b" X( }0 |2 o
- ;精灵内存更新
4 ?; ` o0 P7 E% O& A - LDA #$00& m9 g- s0 G$ [6 U, @$ I
- STA PPU_OAM_ADDR0 w7 j1 A; t2 u* q. ~
- LDA #OAM_DMA_Buffer / $0100
7 M, I" d7 x7 f l - STA OAM_DMA* P# v, ]6 Q# C( g% P) Q! [
-
) L$ I- P2 H+ V: K! T - JSR FC_Gamepad_Process;手柄输入处理. ~8 q& L: G: K: ^
- JSR Music_Select_Process;音乐选曲处理
- D) p; L& Y- O% F3 ? - JSR Music_Play_Process;音乐播放处理
4 x+ L& \7 P+ m - 4 s" V* L, R( _: B, i+ \
- PLA
& e9 G# }8 y2 T; D* D" X - TAY
4 w( N# N; ~6 d0 S! E) z - PLA( q# b& K0 a. q l' q& l- r
- TAX
; g5 X1 C0 i5 f0 F7 A$ X2 Y - PLA# F' J1 l2 l7 Z$ W4 a: Q
- * A+ y6 K& g0 r+ {+ P4 L( x
- RTI
' f# B# D9 i. R - , L2 ?: j5 G, u
- ;======================================================================
# m# _: z e& X9 {7 L' X; S - ;请求中断处理
8 C4 f( \0 i, H0 U2 F2 w1 N( O - Irq_Program2 i2 r& F+ _+ y) |2 e2 r: ]8 d
- RTI
, d$ w0 y% L/ C8 l& f+ r - 4 o* m3 v/ g# l& u
- ;======================================================================
# G X O( f" k+ k0 ~9 N - ;中断向量表
1 F3 l) U" R( s) Y, \/ R1 G7 _3 ^* d - .ORG $FFFA
& G& Y5 O5 ~5 G' n9 @, x - .DW Nmi_Program ;NMI触发时执行& C* s2 o1 a6 x( _% b4 @4 D
- .DW Reset_Program ;载入ROM时最先执行$ ]! H8 H, X% y% R" O
- .DW Irq_Program ;IRQ触发时执行' J# C4 j/ t, l3 h
复制代码 $ K* d1 f* l8 _4 C J9 f# y& V
& J) h3 ]; E+ I* s e9 |( h }0 I# D! |# W* g5 H
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|