|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
9 A. `. r7 l: p' L; |3 k- ~ " @9 F: x' B$ |0 d% \$ m+ f Z
以下是主框架代码:
, Y5 C. G. r, ]( Y- ;======================================================================( n/ B# F! p5 V3 N/ F: }
- ;文件头! h) a$ \9 o+ S) b2 _, ^
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量- h6 g/ p \3 ~/ ]9 d/ P# H
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量3 M4 B0 D- D, w! s5 [
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码5 X; V% E- S1 u) n y8 g" i
- ;======================================================================- | d! E+ C' k5 T
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2* [, \! E+ h5 V. A. R4 g
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
b+ f5 @+ ]3 ~& W - ;======================================================================. E; f+ y& d1 B- F$ j% R/ Q* b
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
+ Y; |( D/ m& W9 K j - RESET_ADDR = $E000 ;主程序起始地址9 R: E: z9 J; X3 @# S1 r( X" M" S% [
- ;======================================================================9 t0 I. D( T2 x
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB$ _, V8 {4 q" {8 E x& W) ]
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB/ t/ \1 F2 L4 U* E3 H% v
- .INESMAP 4 ;Mapper号 (0-4095)
$ f% S6 t% J& b5 a4 F% Y1 n3 [ - .INESSUBMAP 0 ;子Mapper号 (0-15)
+ `" [, E" C! E m" K1 @) J - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)4 W! K' I/ V; ?% {% \% s
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)( ?; Z& E& p+ [8 ?* A
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
5 O# V: ~; J9 _# m, D+ G - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
V1 a0 h( n$ X0 z - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
) D% ] ~& F) D' i - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
9 t% j3 c7 f2 q7 n - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
. N% i7 ~% |3 m - ;======================================================================& p% k, V q1 ]3 \ n
- .INCLUDE "fc_demo_config.asm" ;全局配置
$ X+ a$ n p% V+ ?; @! { - .INCLUDE "fc_demo_constant.asm" ;NES常量
) m1 v+ l1 |9 |* b) `- l6 ? - ;======================================================================& M% v0 b# W; o& W
- ;音乐配置& @* W; ~/ `& L2 }6 V
- .IF 0 = MUSIC_THEME
, Q+ V2 H9 p. X# }% D0 r- P - .INCLUDE "data/music/Gremlin 2/config.asm"
: u# b. O" D7 E: [# E; |0 W8 e - .ENDIF5 V- h) w# N1 K2 G! k& `! p0 @( Y
- , b4 j, l: l+ ~5 t+ V
- .IF 1 = MUSIC_THEME; F" y, Y5 m; i0 [' ^) L K) p
- .INCLUDE "data/music/Raf World/config.asm"
6 P7 W+ ?& I2 P1 D - .ENDIF
9 W2 a0 u1 I' X9 _ - + I1 P7 J2 @. Y: n k( ?) ]
- .IF 2 = MUSIC_THEME
) m3 ?: ^1 `( R, m! j8 ?* `/ H - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
3 K7 c8 t3 h5 e7 u. G* o+ L - .ENDIF
. N) f% U2 V2 ?; i _ - # z3 O5 _4 P# M
- ;======================================================================
8 \9 Q2 L; B* w - ;引用CHR图像数据! p2 c# [' }& S( T ?5 |
- .BANK NES_16KB_PRG_SIZE * 2
# J; a: ^" E4 w& l1 Y - .ORG $0000
+ h" O' ]6 h& W9 _+ _ - .INCBIN "data/bkg.chr"
9 D3 m7 P `; Z& }, F - .INCBIN "data/sp.chr"
9 S; J0 P7 M% \7 ?2 k c - 4 G3 `" t& n! w6 P
- ;======================================================================! M0 I q4 o% \) w
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
# S5 i0 {& U- ^+ R7 Y - .ORG RESET_ADDR. h9 ^- j1 }9 t, r7 J
- ;======================================================================
, K% {4 e; r) Q( g7 W - ;引用其他源文件& B7 _$ m9 H9 h T9 Y7 M
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
& e) P m# B# C; C. f! s3 _5 R/ K - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理% u7 i8 E. V1 I. \/ z# w
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
( y+ z( g5 H2 o+ Y - ;======================================================================, D( t8 j( Z" Q; i/ N' T3 K, N! h
- ) H5 a, n# z# y/ C+ S
- ;======================================================================2 i+ @5 w: d( z/ H
- ;等待VBlank到来
( E0 r: B. U9 s" a/ W _ - Wait_For_VBlank
" o5 ^ G4 ]$ f6 @ e4 y - LDA PPU_STATUS
& W; G3 i1 K1 r - BPL Wait_For_VBlank: _; a: D2 N/ k! ?# u2 r+ z
- RTS
5 v3 f) c/ }+ W/ b2 e8 Z6 H6 z
; q5 J+ l4 @6 C- ;======================================================================
8 ]& B \3 }# H. e2 G - ;调色板初始化6 B Z" Z$ h' ^! |- |7 Z
- Palette_Init6 M/ I& Q; r* a/ _; l1 H% p+ r
- LDA #$3F
5 u4 S, h/ K( a J( X2 d+ R3 p- u4 y5 u v - STA PPU_ADDRESS
+ v' b. X* j6 C. j& K& ]( J6 o - LDA #$008 ?8 Y1 ?- R2 r$ l
- STA PPU_ADDRESS0 I" l$ J' H% g: a5 @$ R
- LDX #$00
0 L4 U! P7 C( ?4 \8 h* N" g - LDY #$20: [2 k- d* [. p- B. K# h
- .Write_Data
- d! F2 [' R/ L, n - LDA Palette_Data,X
$ w$ U1 Y' C# r& \; R* b8 I - STA FC_PPU_Pal_Addr,X9 p# [* n, K! P d
- INX3 H- O6 P6 q' p/ t
- DEY% r2 [* U+ J8 U! E
- BNE .Write_Data
1 D3 M$ I' h" j" F3 n' L2 ^: C - .End
* d3 t. [0 e9 X s3 |% H4 R" r. W - RTS
6 n: e0 r3 N8 R7 Y! s- i
5 Y j2 _. P+ y4 V1 l' n- ;----------------------------------------
0 G( r3 D. ]8 Y( ?' ?3 \ P - ;调色板数据" N$ t: {7 o% `: p" s3 I1 D( g
- Palette_Data
7 [, O& ~5 z& w9 Q' o) E - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B( j9 {/ g7 K2 B3 i( W- W
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
. p8 Y! L& Q [' K+ ? - 5 y9 z. f4 g6 w( L' }" S& K x
- ;======================================================================
/ J" ~$ H) E% ]' _ - ;命名表清空1 ~! P; F- _5 m; _8 y" x' }
- Nametable_Clear
4 d+ N3 e0 J }! y4 }) ` - LDA #$209 E" s0 f9 z) n g% s; H4 N) o
- STA PPU_ADDRESS
, y: e' H& F, g1 ?" o& s - LDA #$00
8 [8 C# H8 S2 p! |1 U- l5 O - STA PPU_ADDRESS
6 ^5 W! {- o/ Z9 X+ @: y4 P - LDA #$00
7 f8 U& J$ h+ ]4 G8 q0 a4 u - LDX #$00
1 } q2 r3 K6 D) i - LDY #$08
) r9 _" b$ m. r& C; m, G: m - .Write_Data7 G5 ]6 j9 E& P6 m3 `% G
- STA PPU_DATA
& D1 _+ ]$ h: \9 {+ C+ `; A5 {! ^ - INX
! i m3 e" Y3 } - BNE .Write_Data9 T O0 A8 `" S) z i
- DEY
& I0 m7 g7 v; }$ q* I$ U' K {! a4 a - BNE .Write_Data, { b" d* N5 m, x2 h6 f- `; ^
- .End2 d. Y. Q6 S. U: b
- RTS
1 d! B% B0 k+ ?- r - 2 |+ ?- `2 ~9 E4 F! _& T8 x* m& _
- ;======================================================================
- w1 ]* j% `4 v! v5 \ - ;音乐曲目切换
, z# `: F2 l/ i% L* R! b0 h" e - Music_Select_Process& |/ E; g% k" w& a
- ! p j- Y" H7 l c+ n5 X, Y. W0 L
- .Pre_Music;上一曲8 W0 A, i' d$ T. Y
- LDA FC_Gamepad_Once; s7 B. q+ V$ e
- CMP #JOY_KEY_LEFT
/ A1 C( `" I; u4 |6 v% y, X% F# P - BNE .Next_Music5 A6 H2 d; B' `+ o( {7 c
- JSR Music_Play_Pre
! z+ |/ z- B! b4 L7 V. V |+ \7 U3 O - .Next_Music;下一曲
3 J" h7 i4 n7 h1 H - LDA FC_Gamepad_Once: g- _+ J& ^) X1 l& v2 x
- CMP #JOY_KEY_RIGHT! {, M0 @0 q" `- G" z o) ^8 f3 V
- BNE .Next_10_Music& r1 U8 j3 c9 j. m/ F V
- JSR Music_Play_Next7 k% G6 z0 i& V2 e+ F3 w
- .Next_10_Music;上10曲9 P" s' `7 g; ]: r" t6 h, h7 i* v
- LDA FC_Gamepad_Once
/ [. x+ H1 E5 G/ Q$ y# o. i9 T - CMP #JOY_KEY_UP
7 U F! E7 R: f# _" g" h) x - BNE .Pre_10_Music$ P" Y2 A/ C# @2 c/ n) f5 Z
- JSR Music_Play_Next_10
0 V, H! M; T" d1 n% p* l - .Pre_10_Music;下10曲0 a$ n; c& r* f
- LDA FC_Gamepad_Once2 F8 Z+ a0 k D5 E9 J6 W
- CMP #JOY_KEY_DOWN
: \4 X# H; B* V) b7 H0 G, _ - BNE .Reset
# p4 z8 V2 _1 s7 _ - JSR Music_Play_Pre_10
3 y4 @- S; v9 m, o( p! r! ? - .Reset;重播当前曲目1 `: n: }' {1 y& n2 j
- LDA FC_Gamepad_Once
7 W) o4 {; D& z - CMP #JOY_KEY_START
; i2 d8 r3 R, f% @3 k - BNE .End
9 Y, b8 a) E5 l4 { - LDA FC_Music_Index" D" l% `, s6 z; Y* L x
- JSR Music_Init_Process
5 ]' `% j# c, A% t - .End x6 X1 D2 y) q; x. f D- o* K
- RTS
, k4 a3 k! l/ m. h% r - , y5 ^5 _7 Y1 b& x
- ;----------------------------------------------------------------------4 n& I. y; Q4 r4 M: S4 Y
- ;播放上一曲
' J, H8 K2 R5 h5 r - Music_Play_Pre: p+ {3 n2 |7 Y2 Z9 a, q! J; m& h
- LDA FC_Music_Index4 U: ?. {. \" e' x7 B8 c
- BEQ .End- z2 g7 w1 G2 u* s( y* K3 G8 G
- DEC FC_Music_Index6 ?- ?# W3 s. _ ]: ?4 F: B
- LDA FC_Music_Index& b) M' o8 @5 X4 X
- JSR Music_Init_Process/ a+ h6 g* N" w, _$ k+ E- }. t6 ]
- .End- H3 B! n" P- l' v2 F3 j4 k
- RTS' @) i6 u; L: y! [1 Q: u
- ;----------------------------------------------------------------------
( s2 g# h) b$ h& h9 p9 z - ;播放下一曲
# W7 |+ t/ m$ h# ~ - Music_Play_Next$ O% D- Y% u; @, y' W, }
- LDA FC_Music_Index1 F {3 E* d* m6 C
- CMP FC_Music_Max_Index7 r$ }0 }" v/ S1 ~4 [" U1 e
- BCS .End
( D; F% `0 S9 |" h4 ^ g! U U - INC FC_Music_Index$ |; c o ~0 O8 o8 r( e1 ~
- LDA FC_Music_Index3 E1 b% G( G- x$ Q# _6 c f* V5 |6 c
- JSR Music_Init_Process. w! Y% R0 a$ X2 V6 l
- .End
+ t% _1 P# ?$ G. W& `5 D N - RTS" _$ u: g; M' j ^% Y J* h5 m7 ~, L
~0 g; ^" q* r9 t) V) R- ;----------------------------------------------------------------------1 x; \9 m+ F- F h X- x
- ;播放上10曲
' P) A: Z+ R) f# \6 g# \ - Music_Play_Pre_10
+ W9 Y$ u* w4 P0 s6 L$ \ - LDA FC_Music_Index! G. R$ e r2 I% ]3 a
- BEQ .End
+ _6 A, Z \5 M) }+ ` - SEC" U% x! k( u g4 u/ n
- SBC #102 G+ O/ N. g' y) p/ Y; ]' ?
- BCS .Pre_10 l$ Y9 ^! `4 a9 S( [# }
- LDA #$00
: ^7 S8 F! v5 \! U2 n3 I - .Pre_10/ z( J: u! u/ c, Q, Q, i# O! }" _
- STA FC_Music_Index
! W H4 B+ j/ H# g9 Z, n9 x' g - JSR Music_Init_Process
8 L2 s4 h$ a3 j9 P0 P' S5 l - .End9 a% c8 F$ Y" [
- RTS
; `& ^# H9 |- i/ q! ~* U$ f4 b - ;----------------------------------------------------------------------
+ s0 ^, L, _( a7 K% v) Q, O; z - ;播放下10曲8 A/ O" P, m7 R: R4 `
- Music_Play_Next_103 g$ u J0 s2 q8 ?1 [! T2 p* O
- LDA FC_Music_Index
' k z" T+ v. t! d& C - CMP FC_Music_Max_Index# ]9 z3 b" J' o7 t
- BCS .End
0 v- T: [2 m, ^5 w8 ] - CLC5 D/ h& C* L; N& @* `
- ADC #10
; h8 Z* r( ]( }. p - CMP FC_Music_Max_Index2 h) V* L* f# k
- BCC .Next_10
( p7 p C; d0 t) B8 Q* I - LDA FC_Music_Max_Index# w4 ?- B& \3 _. V9 V) Q9 e Z8 _
- .Next_10
1 A l4 G. l# k3 y6 g* {! }; |. Z - STA FC_Music_Index
9 q& a a+ b. A - JSR Music_Init_Process
) Q( S4 S+ w) j& u3 o/ v9 v( u - .End5 o) y' R' k: }; b5 {! o
- RTS5 ?$ ]4 Q% O8 d$ X j8 X- \3 ~8 P9 k
- 4 J, g9 A/ ~' s3 b B& w
- ;----------------------------------------------------------------------
1 ^+ g; ]5 Y9 B: M: F% {! ?% f* K - ;8位十六进制转3位十进制制
$ H4 K. ?# ?. b4 [ - Hex8ToDec. R( x$ Q* ]% O ]" ^
- STA FC_Dec_Data_1 {) r% R& q: V/ R( D$ Q0 l
- LDA #$004 \# q( v; a9 L. H/ ~5 a+ O1 E2 d
- STA FC_Dec_Data_100) R% \7 `0 v9 {: P; I
- STA FC_Dec_Data_10) o7 z* k9 N) {# ~+ f
- LDA FC_Dec_Data_1
9 F3 h5 W1 r! i1 L/ ]# u* A& Q) B8 j - .Convert_100
7 T( h5 q$ R4 s* ?# O }, r - CMP #1009 S) O' Y' Z0 b( l; v5 k9 M
- BCC .Convert_10
. S6 B/ c) N% O5 i& F( i - SEC0 Z1 P0 G; N8 v. P. H* ~
- SBC #100
8 C. S* E7 Q8 C/ K7 I- b - INC FC_Dec_Data_100" @8 ~6 V# ~. f2 J8 c' Q
- BNE .Convert_100) ~" \9 I3 c6 }; `0 S7 s7 ?
- .Convert_10# B x) t. G5 W+ G( i, I1 V% s
- CMP #106 g3 H% G1 Y0 g
- BCC .End
4 \ b4 s+ ]- E9 T6 g6 G - SEC/ y) `% q. }" w& `4 B
- SBC #10
- s0 b+ C7 ^" C8 J- U) J - INC FC_Dec_Data_10% e; y. J$ x; B( b
- BNE .Convert_10
3 U: E3 d! ]) I/ C: K3 r* F - .End
- N7 ?( q; z/ U' g4 Z/ m - STA FC_Dec_Data_1
; H4 r) o% K2 o6 S: j - RTS
9 X( D. [' w4 M: m# \4 B6 E. f - 2 I3 e5 q! q$ @. n+ G _
- ;----------------------------------------------------------------------+ L0 D' A7 X6 }. x
- ;显示曲目信息9 m5 z% s7 ~* l2 V$ G
- Music_Info_Display. l( T( r6 i" ^% e3 h
- LDX FC_PPU_Buf_Count
6 ^6 j5 I! @, H2 X& |' M - LDA #PPU_WRITE_MODE_CNT_LINE- i/ d9 j0 q& _; f" e, {+ j
- STA Use_PPU_Buffer,X& N B- s* i2 P3 w" j! T
- INX% p; B, y5 y$ G2 i
-
8 s+ K/ ^" `9 p; T6 y - LDA #>MUSIC_INFO_POS
, [0 Y. _# C2 k/ B - STA Use_PPU_Buffer,X( L1 c% E4 Q3 I
- INX
/ j% H6 @9 x7 ]/ F+ @2 ~4 W1 O - % ]" q' R$ u( o
- ;居中( Z/ t, p5 x* Z& ?5 W5 P% s
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2" M" H! s7 i" N$ [3 t
- STA Use_PPU_Buffer,X
& C- ~/ ]9 `8 _. u" o - INX
: s% f! c3 I }. s6 G& K2 [: h* h - : [* k9 E* d3 v
- LDA #$05
. z7 }1 m( y `6 {' h6 r0 c - STA Use_PPU_Buffer,X
' y O1 R& Y2 Q$ ^ - INX
8 L- M( ]) g6 e -
9 i3 z2 H: f/ K - LDA FC_Music_Index
' L: k0 j" v& F. @ - CLC: j6 C1 q/ v. s1 U; ~; P
- ADC #$01( `' ~% J( Y. R, W- _9 o. C
- JSR Hex8ToDec, Y6 [% ?7 A& ^! c3 e
-
6 t5 a( ]! P! L: y - LDA FC_Dec_Data_10
1 V1 ^; N& G4 o' } - CLC: z8 w: n* M! l; l
- ADC #'0'0 O+ p* o7 D' a! R+ G1 ~- e
- STA Use_PPU_Buffer,X8 U; H/ r0 @- ^- Q* M+ r0 e
- INX( ^2 J b& K, n: N6 A0 h
- 7 e4 x' p3 s, C- a1 W0 \1 D% T; |! P3 d
- LDA FC_Dec_Data_1
& \4 V2 D5 H( M6 u% d0 \( D$ l5 b8 Y - CLC
6 U+ ?" q0 m$ r- d3 ]" i - ADC #'0' `$ B( k7 \9 {8 L
- STA Use_PPU_Buffer,X
& {$ n* N$ \$ c) Z6 ~. Q- o - INX
/ R/ c8 ]7 {! h - 7 Y7 Y" F$ W. F9 w; F0 _ q, V
- LDA #'/'
& m; n7 s: C2 Z) J% Z - STA Use_PPU_Buffer,X8 k& H+ s/ i- a+ v! n d' o
- INX7 j& y' s2 a% ^4 d) N
-
0 s" c* D; E, v6 Z) [5 Q - LDA FC_Music_Max_Index. b( t) ?" z* w" L) `$ T- J
- CLC$ O9 E( ~& q+ I7 j% j7 z, q
- ADC #$016 T9 P) s6 ] }1 p, z; z' C
- JSR Hex8ToDec
3 h* R- L" l7 K5 ] - ; r: v/ T5 o" ~% ]
- LDA FC_Dec_Data_10
' e: A5 L. P) [, e, Z$ e; ]3 h - CLC
7 a$ j2 E5 V+ m7 B* R8 y* Z - ADC #'0'
/ V: @9 h/ ]$ ^/ w$ c9 S. q5 l( V - STA Use_PPU_Buffer,X& [% r- n6 B: S" A" h
- INX
6 C0 [) j+ p" i- y -
% n* n& [) ?0 Y - LDA FC_Dec_Data_1/ y! A1 v4 r, W- ?8 v
- CLC
# f) {+ h3 V) u9 w/ S - ADC #'0'3 H5 l& y4 S- C% i0 q
- STA Use_PPU_Buffer,X$ z' R; D5 z W: [. v2 x& }
- INX
2 S( J" _ i% s0 O2 d - ! ]6 M/ @# y8 e! F
- .End
' [" v1 O' B3 S1 D& x2 s- e - STX FC_PPU_Buf_Count0 `5 ^+ y/ S @
- RTS
+ Q+ e/ H1 k# ^7 M* l {0 k
) p) Q" l8 q( q: J4 N1 I- ;----------------------------------------------------------------------
: ?; Q6 T) x4 M: K; K - ;音乐曲目初始化处理5 h- y, @. ^5 n6 r
- Music_Init_Process O+ h. O, ?7 P2 i" q+ Y2 P: R# Y
- PHA
+ D2 @8 _, O' q3 E - JSR Music_Clear_Process
+ ^! D; s8 a7 R- Z - LDA #$1F
r7 I; w) e+ j* }/ ? - STA $4015
8 }+ R4 h3 ]) |, x) F; H* ` - PLA
! w0 z% H0 N- P+ F - JSR Music_Init_Addr0 n/ Z% ~0 s& X
- JSR Music_Info_Display
. `' w: O. W Q" _ - RTS
# ^, l! r/ o2 m) B- `# u, g" D8 i) n - / a5 J) P7 C, _
- ;----------------------------------------------------------------------- L6 }9 k6 e& Z
- ;音乐播放处理/ _& H3 f1 r9 c7 v# [
- Music_Play_Process
. h3 V) y/ x% ~; u4 c& I - JSR Music_Play_Addr3 I& b2 X4 z' Y; v. Z
- RTS( d, W2 x" { E( K3 W# J) b) F
. G$ n- V4 \1 J1 C3 j6 k& L+ X8 r- ;----------------------------------------------------------------------) j/ S" ^) b: K! Z e$ H
- ;音乐播放处理# @) W0 T, ^& v3 A$ i0 @: q
- Music_Clear_Process3 e* C, X; M) Z4 P
- .IF Music_Clear_Addr
8 P! t9 H6 w) h7 n9 N$ n6 O7 z - JSR Music_Clear_Addr
* T6 R q9 C7 ^$ l( {( Z- P T - RTS* T. T& e% M0 V# M; |8 p: O
- .ELSE
( Y, L3 Q, j4 t1 C Q- ]6 k+ t - LDA #$1F$ h9 q5 m' t ]3 A1 ~6 F$ p6 E
- STA $40153 A) t4 G4 t1 W- P ^
- LDA #$008 A" y9 G0 B, I! @
- STA $4010% u5 x! K+ Z! b* R
- LDX #$00
1 O$ r' Y( c5 q. p2 q - LDA #$00
2 R6 Z6 f- ]5 }- h5 i) t+ Y6 I -
% T) v5 w4 j/ P; Z& _. z - .Music_Clear_Zreo_Page_0
. m. c* k, _" R) { - STA $00,X7 f) ?* H) C# a; H% o7 N
- INX
, e, u5 J7 u9 V [8 _% Y - CPX #Use_Zero_Page_Begin9 J# J) t/ Z+ d# Z5 }2 [0 Y5 z
- BCC .Music_Clear_Zreo_Page_0
0 \, x- n$ m; u - 9 @/ V+ }8 _7 i" J: S7 O. G" ?5 R
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size! m+ B* W& J& i
- .Music_Clear_Zreo_Page_16 F1 r6 ^' E' G9 C6 o1 {* [
- STA $00,X! A% X# S% W* X1 w5 m. X+ W6 _
- INX; \7 S d ?9 i( v- R" m5 L
- BNE .Music_Clear_Zreo_Page_1
2 J" J9 p4 V$ T3 z - ) S5 f, c& f7 N! Q6 z
- Music_Clear_Process_14 W/ _) H, Z- x% Z% J/ A6 Z+ c' v, c
- STA $0600,X+ l8 x/ Q4 v! } |7 a3 [7 g2 W1 r
- STA $0700,X
+ k: l; \% w# M* h0 L( F$ S - INX
/ z* c# {4 s2 N( M7 C - BNE Music_Clear_Process_1; v/ k9 r4 o2 c' s
- LDA #$10# @1 c; q: Y6 O% ~8 U
- STA $4000
& w1 [ c) W( ^& p, W; { - STA $40043 t' O( ~$ v- s0 K) K# M
- STA $400C
; b: L, S( ^9 p {9 X, d3 _; a8 h; { - LDA #$00
" ?0 C7 Y2 y; m; p4 e - STA $4008
! c& P5 E0 \, F, c - LDA #$0F
+ `0 \' d4 `& Y1 `3 C- S7 p - STA $4015: b( S- n5 b$ l/ g. B
- .ENDIF' x) O4 U: m, B5 U( c9 Z
- $ ] Z4 H6 d; l; i/ G
- RTS0 a3 Q1 _% `3 Z% Q
( a7 d' d' G2 c& x- ;======================================================================' G6 X) i t& l4 b0 S
- ;重启处理
! F5 @" K x4 \( x1 a/ H - Reset_Program: Y/ A; ~6 T+ t; ]; d
- SEI
3 G9 l, A3 B6 ?1 B4 g4 q' i - CLD+ {( u* d" X6 O) M% n. a
- LDA #$007 X$ \4 [0 ]; T |0 x# S7 O
- STA PPU_CTRL7 h2 a* S0 z. o1 A- y/ R! s
- STA PPU_MASK
2 b& N/ B' @4 e. b0 z% d, S. p! f - STA JOY2_FRAME: [4 K }! l$ L& g" B; M$ ?
- STA APU_STATUS. k3 |9 l7 t# M; S
- ! ~& s* o( v5 J/ D, ~) w
- ;等待屏幕准备完毕
@! k4 `( i! d! k0 j# V/ M - LDX #$02
0 ?1 }; u% }9 R. z+ ~+ Y8 P" O9 e - .Wait_For_Screen_Ready
0 ?& c$ ^ G) y, Z - LDA PPU_STATUS5 |3 | e% v9 L
- BPL .Wait_For_Screen_Ready
1 ^' S3 s& T6 E5 h0 ~. J$ I+ N2 l/ z% l8 W - DEX l& Q' W& i4 t, \% g- X$ P
- BNE .Wait_For_Screen_Ready
% u: L% e9 [# s6 M1 J3 }# \$ B1 D - 3 z& G* y) _. _' ]: Q8 L+ Q
- ;清空调色板; h2 a& C/ E9 P# J6 o
- Palette_Clear3 z. x; s+ Z3 o# x" ?
- LDA #$3F0 \% G! r: \/ z% {3 J& E" _6 G
- STA PPU_ADDRESS
) M! z, c7 {' p9 y - LDA #$00. X" ~5 r/ h+ E2 R1 a& t
- STA PPU_ADDRESS6 z( t9 @/ a2 o8 h, v+ d, `; s
- LDX #$201 m9 T; ^- d9 v; D7 c" z
- LDA #$0F
: v* H0 s: H$ ~- O/ C - .Write_Data: a, Z% Y; h0 P1 O) W* ?$ i4 h
- STA PPU_DATA9 P, p6 z- [5 q0 `$ Z
- DEX" M/ K" Z% Q- j" N( F) P
- BNE .Write_Data
) j/ W# U+ L- g9 ]
7 o) {1 |) T) p1 G- ;清除声音 $4000-40132 b$ H8 E# Q- y! q
- LDY #$14
: E* [7 ^% h) ?4 g3 w) H - LDX #$00- ]4 {7 S& @* T G, d
- .Sound_Clear
6 s" f% ^, m5 \) f+ U- x - STA $4000,X- Q5 n: ]- l& l3 o% i
- INX
# Y& p) K" _3 N - DEY5 I8 T* u7 z/ Z3 O& u) C
- BNE .Sound_Clear
L) g v, V. T' a% t: @) ? - ) J2 J7 x" |0 g+ r# ]: ~
- ;清除 RAM $0000-07FF
K" M! r X, {' j - LDA #$00* h8 O t0 u! M1 B
- STA $000 W% ~9 ~! W' A: H, V2 C
- STA $01
) B' h3 a# F# I+ \4 h - TAY
5 R/ l* N/ s D - LDX #$08
: }: R8 y/ }, `: m3 M - .Memory_Clear
; s- m7 y# Y: f8 U6 c8 p) z0 L. i - STA [$00],Y
. E2 o1 ~ `* w# `+ o - INY
1 d5 ]2 m. j7 L - BNE .Memory_Clear
7 Y: N# [$ z1 a* \ - INC $016 {/ p5 R& U; i% ]
- DEX
$ a8 H u) J9 n" j: q; M1 g/ G9 B4 p - BNE .Memory_Clear
$ u. z+ Q7 a. W& `2 A2 h" ? -
6 s( a' d; N; D' L3 E9 I+ \ - ;精灵缓冲初始化 f* s. \: h1 [( y+ i
- LDX #$00! n9 b3 K* p% r* G( j/ \9 S
- LDA #$F8" f; B0 `8 }( b- B. Z! k7 _& R$ Q2 `- Z
- .OAM_Clear+ k0 Y5 \% K v0 j2 `3 [
- STA OAM_DMA_Buffer,X6 s! h) e6 f# g# h3 s6 [
- INX; E9 S7 [' A0 ` H
- BNE .OAM_Clear7 _: q8 E! e9 T9 d. Z K
-
% s$ k5 T, ^) R4 r3 _, ^ - ;栈指针初始化
0 x; L3 O9 P8 d$ p6 ^ - LDX #$FF0 P. e6 [& E. D' o
- TXS7 C' K {0 ^9 G! S6 { x8 w* R2 e) y
-
: `5 r1 m; x7 ^- ~+ r - JSR Nametable_Clear;命名表清空
4 t8 {3 X, l- a9 F - JSR Palette_Init;初始化调色板缓冲7 Y+ n! }2 a4 \) U" K5 y- n
- JSR Static_Text_Init;初始化静态文本
/ V4 @1 q5 ?) c; c - 1 P1 V4 ?" O" ?! B1 h
- LDA #MUSIC_ITEM_TOTAL - 16 J8 y9 F" s2 }9 ?
- STA FC_Music_Max_Index' |6 H: x9 S1 k0 C m# x6 d
-
4 I8 V4 y1 _) I% B - LDA #$1F
) T1 R# d; H/ h0 E7 P" o - STA APU_STATUS1 f! _" h8 Z" Z
- LDA #MUSIC_BGM - 14 k9 u, ~5 P4 K5 T: Q- O0 X
- STA FC_Music_Index
- K1 E' f1 h' H/ R1 ^ - JSR Music_Init_Process;音乐播放. M" [ j9 |6 h9 R6 t
- 1 m! K& E: V! {
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
/ a3 H/ l$ o7 U3 j! [ - LDA #$1E
( u5 G- i2 f! J9 M# } - STA FC_PPU_Mask_Buf
, d5 w/ \8 ?. E4 _ -
' ?7 S) o+ C8 }5 }+ z+ A. ? - ;启用NMI处理
& y6 |) n1 M5 J) {9 z - LDA #$80 |2 e2 r7 c. w0 D2 e5 p1 H' z* S
- STA PPU_CTRL" W! U- s: j1 U# Q6 U2 q4 `
-
/ M! _3 M2 o: `! G/ G( s - ;程序循环, 剩余工作交给 NMI 中断处理
m! \: X" [ |2 p* k7 \ - .Loop. n1 I+ i1 t" }# D _
- JMP .Loop
9 g" N7 C8 y9 T9 V. K; D9 d5 x7 f
2 u' l" |7 D9 y7 M: }, C q: p- ;======================================================================( p* J1 n3 g! E. v; [6 I( m) l
- ;不可屏蔽中断处理
+ _9 O2 x% j$ v' m. b) G+ C - Nmi_Program( M$ J9 f7 ~' s; o
- PHA' R" l5 b4 ?6 ]$ `. @" I
- TXA! f8 h- D i7 F+ s
- PHA
: p' C/ s4 X: Q5 ^ - TYA
7 G+ O. _ u2 u4 s* ]* ]9 t3 U - PHA
, X f! X2 V% m' `2 g7 _ - 6 W1 }! s U: K. u
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
4 W) B4 o2 S$ _* W n. b! q - 8 i" e+ O* K$ l# ^7 q8 g1 s
- JSR FC_PPU_Procrss;PPU处理
3 g# G/ h: @8 n2 q* G! T - 4 Q7 z" t+ W9 ^* J7 b
- ;精灵内存更新, t. N6 g. @+ d- W% N& ?
- LDA #$00
8 b k- v, R1 I) h4 E - STA PPU_OAM_ADDR
$ b$ H8 p. F1 g/ |1 P - LDA #OAM_DMA_Buffer / $01001 e0 B9 ]1 ~9 F; j, \0 T# q
- STA OAM_DMA& g" l9 v7 x7 F( p1 i/ O
-
" b4 `9 |. p( ]) U& h0 I/ ^0 j/ e - JSR FC_Gamepad_Process;手柄输入处理" ^) t& z. v# N* E2 b
- JSR Music_Select_Process;音乐选曲处理; b- p: b F9 p8 ~
- JSR Music_Play_Process;音乐播放处理! H6 C& `% ~: d$ C( P+ P( ~9 d
-
( X& F* E' b4 L) Y - PLA. E( t y! I2 i: M% H P
- TAY$ l' n; c7 R3 W' r: c. \
- PLA+ z* C C/ \- Q0 H; l h
- TAX
) u+ t9 G' f* F. }0 h4 T: o - PLA
4 @0 ]3 |2 i5 k
0 Y4 k8 v z/ Y: h" g- RTI1 _* u8 E7 ~) P
3 P4 w3 [7 k+ ^. F9 `8 A5 c- ;======================================================================
6 T E% G1 K2 } - ;请求中断处理4 k8 Q% _8 o; h# B5 c- g; O9 N
- Irq_Program: ^5 s, g' ~0 Q3 i
- RTI
: V6 }) O# O2 i! |
5 o3 s+ R5 F5 J- W" k- ;======================================================================5 z( m7 G i3 Y& ]( S
- ;中断向量表2 b: `% [) K* ]: f8 u. P# R
- .ORG $FFFA
) g. z1 ^7 ]) W6 y4 o5 t - .DW Nmi_Program ;NMI触发时执行
% X9 M9 J8 b3 N) `, s - .DW Reset_Program ;载入ROM时最先执行9 r: ^' M; l) G: f# \
- .DW Irq_Program ;IRQ触发时执行( f3 J9 Z. @% m! ~0 G. R2 h
复制代码
( Y4 u( R q' ]& x, i/ B% ?% ^% K3 s7 a2 z. ] v
3 V3 T5 b1 z4 O. q
https://gitee.com/flame_cyclone/nesasm_3_2 |
评分
-
1
查看全部评分
-
|