|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下! T* x6 {5 f- @' R

- H" w- n8 I3 a+ L/ Z4 d* }1 d以下是主框架代码:
* b3 @1 r( y% |1 t- ;======================================================================
6 N% W, I. B3 B1 q2 _8 v - ;文件头
$ s; K! Z/ e/ T2 t0 f# \) R - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量( e1 N0 j4 v& q6 b. K, t5 ]8 Q
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量5 \/ T8 G& X$ A2 J! s) u9 U
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码" n3 @3 J) Z9 v8 K6 r7 M7 k+ @
- ;======================================================================5 v+ [$ h5 k( m8 r# Z
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2
- C2 |) c& N2 o4 T' R - PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
* [" V& A6 ^; O: c$ F3 v - ;======================================================================
6 }4 L4 b8 Y! K) Z& s4 f - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
- H# N& c2 U) L- w0 j1 B c8 l - RESET_ADDR = $E000 ;主程序起始地址& @9 m1 K% q; A
- ;======================================================================
# }' T* a: V6 K - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB) Y l, ^0 `! U1 E
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB0 k4 W+ a8 { M$ B* H' O% \
- .INESMAP 4 ;Mapper号 (0-4095)9 F7 X8 `5 B+ a. `: h% U
- .INESSUBMAP 0 ;子Mapper号 (0-15)
3 P- Q4 m6 g( A: | - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
- [& s. R5 j+ n6 Z5 r - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
, Z7 b7 E4 G- h: ?/ V - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
) _1 {7 ?5 A3 r4 [6 Z - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)9 ]. ~4 w. ^, A$ ~' Q# F0 _4 n
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数) m, L" q: [2 O5 W- y l U
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
3 F- f I" Q6 a6 K+ i( @0 \5 V - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
: Q0 X6 x. S0 \9 l - ;======================================================================! V/ B: B/ s) ~4 S6 t8 j8 g B
- .INCLUDE "fc_demo_config.asm" ;全局配置7 g2 A/ @7 n4 ?' T; y
- .INCLUDE "fc_demo_constant.asm" ;NES常量, p% t0 |; n- D
- ;======================================================================" [; ^! L- p, N
- ;音乐配置+ O( U/ a# h9 C, C# @/ q
- .IF 0 = MUSIC_THEME
: l4 E( U$ _- C* W/ Z - .INCLUDE "data/music/Gremlin 2/config.asm"
; O- E8 b6 f# a3 F6 E9 o2 R$ u- l) } - .ENDIF
6 U. I$ s+ b7 N6 P* [# [) |2 H -
" g' w, P3 `8 Y, s* @" P - .IF 1 = MUSIC_THEME
( J$ U4 T5 |0 }4 E2 E0 ?6 Z' | - .INCLUDE "data/music/Raf World/config.asm"7 W/ ]( x2 y/ C" X. U5 x5 l8 @) V
- .ENDIF" Y# z- O8 r, `4 H# V0 b
- " V, a0 f# v, i! M
- .IF 2 = MUSIC_THEME
4 a& y1 e' ?- t3 x - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"# F6 ]* {7 l9 x a% V3 B% Z
- .ENDIF
4 q# I2 c6 Y3 i X: ] - 6 t2 [& r! T0 m& k! q
- ;======================================================================+ N- D1 S. N1 E
- ;引用CHR图像数据
& B! ^5 @) e$ f# ?3 v - .BANK NES_16KB_PRG_SIZE * 2
C, g/ v4 U9 o - .ORG $0000
5 v% U, y! l: O/ i/ ]7 T - .INCBIN "data/bkg.chr"
7 t5 _0 q: m+ |; i - .INCBIN "data/sp.chr"3 j! Z6 O4 ], [2 e" y. ~7 p
- 1 V) j, ~( U6 s" `# p9 p
- ;======================================================================/ D! u9 L( @6 B9 q0 J; a
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
3 W) G9 Z' g- D. h+ I% t - .ORG RESET_ADDR! g) C6 m; U" F* G
- ;======================================================================
" i) S" C: Q* v4 ` - ;引用其他源文件$ ~ n4 _8 k7 f3 u+ C
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理4 v; M1 v& j6 f0 D0 t' \; B! }
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理8 T1 _* w0 r. S1 B3 ~0 P% R& l
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理1 O4 P$ d* v/ @1 a: y( I. f5 e w
- ;======================================================================
/ a& p0 S" ?4 V1 T8 b) c' T
, N( ^- _8 ?4 H, L$ O9 N- ;======================================================================( A5 V" x# i- m, P
- ;等待VBlank到来3 z5 m/ h6 Z' @! o. C8 @ J! h
- Wait_For_VBlank
0 n& _5 m" J7 m; B: c - LDA PPU_STATUS) n) |1 R8 ` H+ ]
- BPL Wait_For_VBlank1 A. f6 A( p" Q4 ~& r: t
- RTS) C# K! n# y+ [/ K
- " @4 j2 b4 p. X" ]7 K' [# }8 U
- ;======================================================================
! Q6 S5 H" f* g" p. z - ;调色板初始化* ^& H' @1 a* L- L0 }5 U- o
- Palette_Init
' x, _1 M3 `# N j5 E( Y - LDA #$3F
! Z s6 v! R4 O1 V; |0 j8 @ - STA PPU_ADDRESS
6 s% k: f9 ]* R; B7 {: j/ y# F - LDA #$00
: A P7 T( t# q7 b1 s' ` - STA PPU_ADDRESS
/ L0 ^2 Y3 d9 `, Z% ?8 G9 ^: t - LDX #$00& o) ], [8 W: L$ N. ~' j0 s- H3 Q/ q7 S
- LDY #$20
( A3 U4 \9 ?: G6 u - .Write_Data
! _2 @9 H- t/ ]2 w) V - LDA Palette_Data,X! l& z. g$ c5 E' c( w& u3 T/ y
- STA FC_PPU_Pal_Addr,X( ?9 M- t/ @5 z& \4 U
- INX
& K: ~5 q5 x$ R5 s/ y* t4 H - DEY
# [# V$ u3 u4 b3 N+ Q$ ~ - BNE .Write_Data e! v4 ?' u1 z* l
- .End& W( o7 X9 Q0 N6 C6 `! ~$ \
- RTS, L2 f# [* k2 G6 C$ I, ~* R
- # g+ k9 d6 B& O; d9 P( A
- ;----------------------------------------
- \: ~3 F& p9 {6 [ - ;调色板数据
% ]7 P! _2 \' Z4 M1 T' v- [ - Palette_Data/ O7 _! r% g$ U( g
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
; S: h9 Q* `" l. U - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ K) V) I9 G ^2 L' U/ I. k, X' }
- 7 H" g2 {+ o6 y" K! O. |
- ;======================================================================1 F/ G! w! y% ]2 m5 C8 C. j
- ;命名表清空
+ W- W: t3 Y$ X$ [0 \0 j- \ - Nametable_Clear
+ W3 ?4 x1 C4 r# \: D - LDA #$20' f; C8 Z4 t( B
- STA PPU_ADDRESS
4 R# L2 @" ~' P- q. _3 e& ~' U% e - LDA #$00
/ g0 B& o0 Y- _, Z( n4 R7 L" N - STA PPU_ADDRESS
" A/ m4 Q' e. @- n: E# p - LDA #$00% }: G8 T* ]! ?: i
- LDX #$006 H1 ^* ?* a' q ?) {( {# D+ ^
- LDY #$08; j3 D+ S* h6 g/ F
- .Write_Data1 X8 @! N/ k: Q8 _8 m& ^( L
- STA PPU_DATA1 g( O0 S9 \- x
- INX
, }9 g5 {; v" h: L0 |0 q4 Q) Y - BNE .Write_Data, I2 ]! Y9 l* |3 Y* Z7 i* z
- DEY& w1 ]2 u) v* X4 Y: G9 J ~9 i n9 ], \/ Q
- BNE .Write_Data: @* _1 ]% z, C# ^5 b& a; m$ Z9 i
- .End
& e$ V& K# o; q0 U& X+ Z - RTS; D4 V5 {9 Z( G' w. S( y" Z# C% W
% ]$ V- i9 t; }' W# v1 O- ;======================================================================6 B, c( F: V4 M2 G) M4 s+ a
- ;音乐曲目切换9 m" i% s/ U+ \6 Z K7 e
- Music_Select_Process
0 ^- N v! V" N# R - 6 f$ R$ n3 {3 j+ K
- .Pre_Music;上一曲+ h2 e' K6 _& d) _
- LDA FC_Gamepad_Once( i, f; S1 E0 G' \, ~8 z C
- CMP #JOY_KEY_LEFT
. l# S/ d! ` T3 h& Q8 O; g - BNE .Next_Music0 x; ~1 @- J0 \% G4 T
- JSR Music_Play_Pre8 s* m* g" x" x" l' i8 |
- .Next_Music;下一曲
, {$ M8 n9 n/ U: n" F - LDA FC_Gamepad_Once1 E/ j, {8 f( z% F
- CMP #JOY_KEY_RIGHT
, I* s% F2 Q7 H: j4 E$ b1 N1 u! [ - BNE .Next_10_Music! U, Z5 j' y$ d8 Q- K4 g0 C* b7 Q
- JSR Music_Play_Next
1 h: P6 F$ B. X - .Next_10_Music;上10曲2 j W9 r7 B: Z( O3 l& u9 ~
- LDA FC_Gamepad_Once o0 C8 J# c- A& T* z3 m% y, n7 ~
- CMP #JOY_KEY_UP3 t; M- C1 b8 I: Z+ b6 ~
- BNE .Pre_10_Music
) B% v5 O+ U5 h# P - JSR Music_Play_Next_10
B* P- Q4 e# U, K, s" ^# W" M9 O - .Pre_10_Music;下10曲
/ @$ D7 ?2 s% _ - LDA FC_Gamepad_Once% ]1 k2 g2 u1 F5 L
- CMP #JOY_KEY_DOWN7 R# P3 ?+ M1 G6 q- j, I
- BNE .Reset
4 H( @( b7 b1 }, c - JSR Music_Play_Pre_10
7 O: i8 Y( t# _ - .Reset;重播当前曲目, r a! Q# U5 X& s9 \
- LDA FC_Gamepad_Once* s/ p2 w: A! X9 z# ~* z0 X
- CMP #JOY_KEY_START
$ z0 F4 K$ Q5 a% L' _+ S - BNE .End
6 E/ l- J' S$ L2 Y5 d - LDA FC_Music_Index
1 i# S9 V5 b _+ z) l# i- H - JSR Music_Init_Process
8 R6 z9 s3 [: Y/ D9 ^ - .End
* U+ x: n) @8 H, h/ i: X3 |/ X, J$ U - RTS
: K/ v! H' m4 z. m4 Y3 z
( b! ?6 f$ c7 J7 F- ;----------------------------------------------------------------------% u+ l3 @8 F( a3 G+ \' J
- ;播放上一曲8 I4 d, w! X6 x- v
- Music_Play_Pre" g( g: M! U5 V1 f- J
- LDA FC_Music_Index2 t8 _& Q& P6 R0 H: a5 t/ V
- BEQ .End; u4 L' K6 d) w: r" z4 {& g4 B
- DEC FC_Music_Index, ?, I. W; b. Q, F' { D% Z/ b
- LDA FC_Music_Index
1 O: C, A5 T; i( z/ ?' Q - JSR Music_Init_Process# n; r0 ?7 |( K0 K
- .End
, M4 j* \! ~' j0 H l0 s' c - RTS, z9 ] k) D% N; g7 R
- ;----------------------------------------------------------------------/ [: c4 s" P" d" w4 g p
- ;播放下一曲* \" d$ T" x1 M* C5 R
- Music_Play_Next8 I" {+ P, I5 m' b6 h
- LDA FC_Music_Index
9 ~( f0 w5 B: `+ P" ^4 l$ ` - CMP FC_Music_Max_Index
/ S2 s1 q. F Q! @0 l - BCS .End
- ^" ]3 [6 \- @/ i' s3 g - INC FC_Music_Index
& p# p, f2 ~8 c U, o - LDA FC_Music_Index
% K T; s' p3 [0 ^2 M, t _5 F - JSR Music_Init_Process/ m/ K- \6 @8 E e, X
- .End
! D, l; o- L1 s - RTS- R, g/ D# C) j6 [% ^$ t
. U8 y. X6 `5 ^% |- ;----------------------------------------------------------------------
$ d0 ^. V! R+ P - ;播放上10曲
9 ~, f2 s. n& z0 x, k! ~ - Music_Play_Pre_10
3 h! \3 G- ]: }1 y5 |" ]( E - LDA FC_Music_Index+ [) [* U) T0 q8 u! t1 A: G
- BEQ .End/ Q) ?2 z" q+ d# z0 Q' U. W
- SEC+ K4 H9 l7 n/ \" Y+ k ~" _
- SBC #10, k% L2 D" V6 l
- BCS .Pre_10
r: T" y/ X. }" q) g4 ?& { - LDA #$00: K$ Y( r! t, q$ M. d
- .Pre_104 s! p! N4 S* x* B6 \9 p
- STA FC_Music_Index r n f3 N' y9 N
- JSR Music_Init_Process3 s( [0 m7 B' f! Y; n+ W' R
- .End
) r g$ g/ V3 q+ c - RTS8 l' D7 y- J2 b5 ~2 h' x. w
- ;----------------------------------------------------------------------) L1 o/ t+ b$ f, c
- ;播放下10曲
. i$ N( X7 C% H. h) ~8 X) u! p - Music_Play_Next_10: P1 F' ]! s" `) M# J
- LDA FC_Music_Index& n' e/ M$ h: Q/ \" S/ M
- CMP FC_Music_Max_Index) A! T( N5 ?! w% M. p
- BCS .End
% a1 S" |- a3 _' @$ @- B r7 @ - CLC" T" f( b) A6 T! s! ]0 D
- ADC #10
7 w5 L: g& C2 U: d" \( Y$ c8 _* F - CMP FC_Music_Max_Index e/ Y- g, V+ Q
- BCC .Next_10: M: u, C4 |& z$ T
- LDA FC_Music_Max_Index' J/ |' b: Z* |! @& Q
- .Next_10
5 u2 H7 I+ S: n: O5 A; ?+ q - STA FC_Music_Index( c6 h/ D% V* I( ?' Z: y! P
- JSR Music_Init_Process
! M* ^; c) c4 E1 Q+ y& b - .End
3 G2 ]2 g; b6 V - RTS. f6 X2 ]: y! D* k- @- q
- / D, b% j- Z6 p* R- [( J8 V
- ;----------------------------------------------------------------------. y$ X3 ]0 P' [% c( X$ U2 G; c
- ;8位十六进制转3位十进制制
# ], B! d; ` I; ~& O7 T7 b - Hex8ToDec& n; g9 N( H. U* T
- STA FC_Dec_Data_1
9 ]2 O6 M# }2 f0 n/ @ - LDA #$00: z$ ] r( I6 {; h
- STA FC_Dec_Data_100
5 _2 `9 Q2 _: s0 O9 S - STA FC_Dec_Data_10
1 D6 u! i% J" E/ g# O7 H* f - LDA FC_Dec_Data_1& n1 K% Z: {" e7 G: h8 Z+ j C g% `. l
- .Convert_1001 H1 T- V- n1 H z( g4 b& o _
- CMP #100- Z8 x( T( F6 S0 T2 P( U$ K
- BCC .Convert_10
0 I" J5 @: D8 k" T2 v6 I" p# u - SEC3 L! T/ d/ p' N! L
- SBC #1008 o' V. w/ a, W
- INC FC_Dec_Data_100, S" F1 D7 M8 D
- BNE .Convert_100' L5 Z% u r: a: t& ]
- .Convert_107 W% b4 M7 L+ e4 i3 `) R9 r
- CMP #10
/ Y: d1 H# e$ L/ M - BCC .End
8 d. {6 a) W8 g - SEC% z+ J+ e. p' e9 B0 D4 q& d
- SBC #10/ L; d' V/ A* J. h# @: p% r
- INC FC_Dec_Data_10' u* t* [3 h5 C6 F7 m8 M
- BNE .Convert_10
- r: T4 L: L( f3 m8 i8 C - .End
3 {% D- g& u8 i* m% @6 c- r! r% Z - STA FC_Dec_Data_16 Z3 B' N/ s. _; O. k4 w/ _( H( Y
- RTS# j9 @6 N/ Q& r' q+ M& R' w
- " A; Z/ ?9 o1 b+ K+ ^7 L. o
- ;----------------------------------------------------------------------* O. l1 Y- U( N& ~- [% u; ]
- ;显示曲目信息& j' e2 \$ } w' ^ g0 y1 r) p
- Music_Info_Display# k7 n9 c; Y8 @2 T- E. ]
- LDX FC_PPU_Buf_Count0 u7 N& v7 k6 q8 M% |( v
- LDA #PPU_WRITE_MODE_CNT_LINE
# i, H1 _, `1 P% F9 E% {) t6 | - STA Use_PPU_Buffer,X' t9 `3 B; D- s: p7 }
- INX" {+ E4 Y* \5 ~! q2 ]( X( {
- 9 D+ d( W5 H- v: N; J% g& X0 q- i
- LDA #>MUSIC_INFO_POS! Z7 A6 E5 ]; p. g' f `# ?( x# c
- STA Use_PPU_Buffer,X
, }+ U5 G- [# C4 }+ q( W9 ~ - INX
' h& ]- G7 p6 f& L4 N -
2 ?4 Y1 X, O& q% L, q - ;居中
: D, {4 Q/ e$ [' ?' Y$ N/ Z0 v2 S5 f - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
. h0 V7 K2 Y! |! ^# `3 }: o - STA Use_PPU_Buffer,X
% T7 ^' B& P& M% l. W* L - INX/ f. K0 I2 R; n! p; c# ~
-
# H3 v {; o7 T( [9 P( r: \) o* ^ - LDA #$05" B- H+ T1 s0 `1 B8 p- f
- STA Use_PPU_Buffer,X
" E3 }; j( U U% `( e& p E: ` - INX5 \/ Q: f( C* G' B- Y2 y$ X$ P7 {
-
/ V. o% C; X9 b, o( Y- e - LDA FC_Music_Index5 ?( x5 s C: V/ A7 w) }
- CLC
: V2 ^* A( z" B - ADC #$01
0 q/ `6 d4 P. f9 a A" Z7 R5 T - JSR Hex8ToDec
% @' V1 B! \3 d- _! W -
- Z$ C6 f6 d9 y3 j - LDA FC_Dec_Data_10
" v6 S1 E. j) j: ^0 z! u - CLC8 a7 u: s0 r, ?+ c7 m- D5 }
- ADC #'0'
/ {) f. U' X# S4 J `5 ]; f - STA Use_PPU_Buffer,X2 Z' O' s$ O; h$ O2 F; G
- INX6 N# V. Q* ^/ }+ c8 h" y. J
- 7 F. \) t8 J; P# ^
- LDA FC_Dec_Data_1
( F5 w+ [5 P* S& { - CLC
" l. Q# [6 w- P( g! t! w4 B - ADC #'0'
5 M! Y& D: m' L - STA Use_PPU_Buffer,X# [/ h1 R+ Z9 \- [4 k: p4 N
- INX
8 m, I5 s7 d5 N* Y# M -
1 @2 r8 u1 s, _( _4 I7 l k3 | - LDA #'/'
! Y9 u" B& t0 K9 d" u1 L - STA Use_PPU_Buffer,X. ]& g# ~# j$ @# I
- INX% b4 H6 Q0 f9 _
-
2 K! X8 Y3 z; g9 y, s - LDA FC_Music_Max_Index
4 i) m- m1 g, J0 M; u# \ - CLC% \: K: S" u. y
- ADC #$012 n4 ^( z" i* V7 U% d
- JSR Hex8ToDec
7 j& B* s; v" T+ [ - , G! F2 A: B6 V. {
- LDA FC_Dec_Data_10
4 u v9 O8 T4 w4 ?- @/ E$ g7 E - CLC
+ J/ J% q! F& S/ ~' k1 S - ADC #'0'
`- h, l, T( \6 b3 ]' {. ^- C - STA Use_PPU_Buffer,X
) a6 v9 P) p, C) v! c' M! f! Q5 n3 { - INX) s3 S6 S4 z* l- ^" d% y
-
8 a0 W: c- |" w3 O% e3 S - LDA FC_Dec_Data_1
& ]: p6 ]8 Y9 t' y& z - CLC/ V& G0 T. Z4 V. {
- ADC #'0'
d/ y m( P/ H6 j1 z1 [ - STA Use_PPU_Buffer,X
- x" Y! a0 s1 o) L - INX" T" E, f3 x- o. j* o
- 7 {& [, G! S# J- g
- .End' V @( h. E9 y# I0 X' A
- STX FC_PPU_Buf_Count' h$ g) y& ~6 \# X, ^
- RTS
1 P" m$ @/ ?; a1 F+ k - ; G0 d1 S6 Q+ u6 M3 i' P3 P$ V
- ;----------------------------------------------------------------------
9 c D* d; c# Y' W2 P - ;音乐曲目初始化处理
! f; E4 _. }6 G1 f" t - Music_Init_Process$ j+ y6 g2 ]) M- n+ b) S
- PHA
+ }" x: T3 O8 p1 U - JSR Music_Clear_Process
8 I, u1 ^. P4 f5 d - LDA #$1F( W ]7 Y) p( s/ f" C' ^! D3 M
- STA $40159 K6 c3 Y; K" m" ~4 C& h
- PLA
6 O7 o) V5 m7 _3 D& i/ G) M - JSR Music_Init_Addr
& R4 g5 v' z/ \' M% C6 L2 u - JSR Music_Info_Display
* \& R! \5 @' _/ L - RTS
# [0 P4 D1 M2 v- ~' B. ^ - ! H) D0 F7 ~, S3 p" z. V8 _
- ;----------------------------------------------------------------------
3 g3 o* w6 _3 z; H - ;音乐播放处理
6 V6 J& L6 g4 G6 n z1 ]! y" l# e - Music_Play_Process
( \$ S; v) Q, z5 U3 \ - JSR Music_Play_Addr
* x6 Y( ^3 o" A2 g, I - RTS
# x, c% t9 ?% v n) E - $ }8 m- q6 v' [
- ;---------------------------------------------------------------------- J# T& k: w9 @: d! f7 F) l
- ;音乐播放处理
3 Q9 N- q5 [4 a3 y* X5 c/ J- V - Music_Clear_Process9 Q+ {* W/ v: g% F$ k
- .IF Music_Clear_Addr( H$ [" U& {6 ]& i4 E
- JSR Music_Clear_Addr
1 {" p2 x+ n: T - RTS
5 @, z y% }! ~+ N2 T - .ELSE; h& c9 S/ w: r5 d: r8 x* ~
- LDA #$1F
" s6 x# \# ?& A - STA $4015
# |6 J4 }! S* ^' I1 N - LDA #$006 v) x* H9 |9 w+ f8 X6 R
- STA $4010
2 J# } {9 [; k6 O! b/ N9 c - LDX #$00& P, v6 n( x1 Q1 X0 D, ~# Q2 R
- LDA #$00/ P8 s$ m) W: j9 E ?* Y: D4 T7 k }( G
- & ]' n7 y4 G, W1 n# [
- .Music_Clear_Zreo_Page_05 L4 I/ i5 P3 d) d1 O8 Z! ~
- STA $00,X
6 X. a' J. I0 ?$ {1 o7 | - INX8 Q7 n% e8 K, j
- CPX #Use_Zero_Page_Begin7 @* d! l; `) N5 z8 `
- BCC .Music_Clear_Zreo_Page_00 t' Y. `: b4 ~+ ~" B$ A' G
- ' A' H8 F, }6 Z/ x3 c7 N) Y5 K3 o/ j
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size' K+ l1 b! T' t, n) E! i
- .Music_Clear_Zreo_Page_1
$ d9 }, \ D" _0 U( @+ b+ H& M - STA $00,X6 ~' V4 A3 {/ N. i, s
- INX* J3 C% P) p) _/ x2 v7 \
- BNE .Music_Clear_Zreo_Page_1
1 W! n! ^7 T7 k3 a1 g1 I6 @8 C -
. s% v; g. q% j) l8 E+ r) G& V - Music_Clear_Process_1+ P: ~* F" F& b' w* |2 I6 ~
- STA $0600,X8 i2 \* k7 I9 ]
- STA $0700,X
. F- B5 |* h i2 @7 P$ v& B3 y - INX0 F F9 g$ z" p
- BNE Music_Clear_Process_1+ R" _3 N$ D T! b; }- [
- LDA #$10
" G1 s a( k6 O `, P/ c2 M9 L - STA $4000- \# a% h( ^- L& \) u* L6 H
- STA $4004
4 y6 L% R( M' e I3 @' F# N - STA $400C
- ^' t9 K# I- z& U G( T; k - LDA #$006 _! @9 }0 z7 V9 [' W5 {7 G0 J
- STA $4008
4 f" q' k1 J9 q4 V - LDA #$0F
f% }! e6 o7 I! ~7 V - STA $4015
3 d0 u9 D; c* j& K' {6 [ - .ENDIF; Q( P' w7 r. C2 O& u, d
- ' O7 t" c* E* C
- RTS& k& [- Q5 G/ S5 ^8 n$ {
9 W6 K; n/ r; t7 V1 @0 B, m- ;======================================================================- x& S0 h0 ~3 f0 X# a. Z
- ;重启处理
! }: p" N1 _$ h. b6 m, m1 o" q5 { - Reset_Program
' @; ~2 {3 ~4 D* O- C3 U - SEI; b( I, D) R) [5 T0 i$ ^
- CLD& s# X4 K' n. c4 o9 h8 R
- LDA #$00& Z; C, @" m- g$ l0 u/ H( B5 a4 Q
- STA PPU_CTRL
, h& A9 o5 x$ m# L9 H - STA PPU_MASK
4 S9 \5 u' l3 m: T - STA JOY2_FRAME+ j8 J- m% s; U2 e; o
- STA APU_STATUS
! I$ O( f4 `- d/ o- D: ~! O -
5 F3 o3 |4 y# g. P; M# f - ;等待屏幕准备完毕
5 I2 R3 X* m- s+ e0 f, F2 m - LDX #$028 Z& p w& t+ y' s
- .Wait_For_Screen_Ready/ N0 |2 d) f; q; T
- LDA PPU_STATUS* D5 u1 G# H5 ?& [! K8 v' Q
- BPL .Wait_For_Screen_Ready- |' W4 O4 j$ `/ i. K
- DEX# b( U' X5 V, S5 J+ u
- BNE .Wait_For_Screen_Ready; K$ ~0 ?, w3 z2 [
- ; j+ m* Q5 @) l
- ;清空调色板$ T7 F( c# }/ H8 U+ Z7 r2 L
- Palette_Clear
/ Y0 _/ M2 @ D7 ?7 j - LDA #$3F
( {& }4 J; k: N/ l% T - STA PPU_ADDRESS$ x* Y0 @* p0 A& @- K( K" q
- LDA #$00
; a- ~, m6 |1 R9 V1 [0 J - STA PPU_ADDRESS
3 |6 Z0 ]) @! o; q4 p - LDX #$20
- n5 J$ V# Q2 T7 _2 o. d: I* M1 { - LDA #$0F: u, y! Z N& X$ K! O9 X
- .Write_Data4 c. y/ I/ i! q* l, W q
- STA PPU_DATA
1 x" a: Q+ `: p; u: t, K7 {% x - DEX
) C! r3 m* E/ B7 n; }2 V) f x - BNE .Write_Data5 r) Z6 v2 Y" }6 T7 W
8 E3 L$ n' b/ z4 p+ l- ;清除声音 $4000-4013
( m A& R( q5 v" a - LDY #$140 V3 F2 h- w9 }
- LDX #$00. a# S7 d3 B% l. x: y! U% J/ c
- .Sound_Clear
5 a8 J7 N' X" |2 p1 N' q7 a - STA $4000,X A1 ^! }. E+ _7 n: ~' U
- INX3 K) Q' }- g. l
- DEY
; @$ |/ x8 R6 ]& A" R: Y" r2 w - BNE .Sound_Clear
; J& Z$ F* G% d: Q0 Z7 ? -
: h% ~% g/ g- b' P0 q" l9 ~ - ;清除 RAM $0000-07FF
" _9 E* a4 N$ E1 E - LDA #$00! m4 P3 R) {8 A1 k2 u) g
- STA $001 X' n5 O' X! X) j" H8 D2 I# w
- STA $013 E; o. h% t F2 r1 Z& h
- TAY5 W4 r* [ z( x8 Q: I
- LDX #$08& D6 f0 l1 P# Y' T' V! p, n1 a
- .Memory_Clear& s/ \9 P" ?/ Z' E
- STA [$00],Y3 \& i( d4 d- i" |' |' f8 Y: Y7 w* b
- INY
/ ^& Q# S0 W0 x5 `4 j - BNE .Memory_Clear
- D& G# z/ W! r+ \/ r5 b - INC $01, o+ ]( _. H) o% t3 s4 e+ Q
- DEX5 D$ K/ r- D( \. \2 U; Q
- BNE .Memory_Clear j9 w5 p8 F; w( k. U: e; m+ O+ H1 U* r
- 3 L. Z5 m& l0 l7 w1 V
- ;精灵缓冲初始化' s! z6 z9 z. M- J' l! g7 X! h: I
- LDX #$00( {/ M/ C2 ^* R6 @& F5 {
- LDA #$F8! s8 w/ a$ h; S
- .OAM_Clear
4 k' c6 T$ {; W! P" o - STA OAM_DMA_Buffer,X
+ ^! ~) ~2 l5 L. Z9 Z/ ]% [ - INX
$ |% |0 A$ L7 T1 \ l - BNE .OAM_Clear
6 A5 |' _3 a2 A/ p -
- Y5 O$ @# j& m2 p% n3 m - ;栈指针初始化
3 W* n% Y/ \' B0 B- q4 e2 y7 { - LDX #$FF
8 x# i0 f- A7 @( k) i- t - TXS/ i' n5 O% h0 z7 t" g
- $ I1 D( Q4 y! l" Y+ E' C5 N
- JSR Nametable_Clear;命名表清空9 I M& {+ c/ C! x# f
- JSR Palette_Init;初始化调色板缓冲: z# X3 b9 s- d- [" ~: |
- JSR Static_Text_Init;初始化静态文本
' s# O6 d; M1 {. b; D" i -
2 d$ N$ U9 X- u+ r$ g - LDA #MUSIC_ITEM_TOTAL - 11 P+ i0 e& O2 J0 J5 g
- STA FC_Music_Max_Index
; F( p$ Y: O/ s1 B1 U -
' B6 X+ X5 C& ~3 e# t( P" u - LDA #$1F
/ X6 h' D* v8 h" J# s1 X* { - STA APU_STATUS* L i4 L, V8 J# p* s/ L, Z
- LDA #MUSIC_BGM - 1
7 g/ Z' C6 E2 W6 T - STA FC_Music_Index$ F/ c C; N5 f+ p Z5 q% W% G$ j
- JSR Music_Init_Process;音乐播放" m7 {* ^7 J' K6 q6 h1 I( T
-
/ M; u0 y% @4 S; H# Q$ [; w+ ~ - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)2 l4 M8 k! }, }2 x
- LDA #$1E1 v, v: M, N; @) n6 I
- STA FC_PPU_Mask_Buf" M. L# B5 l2 E2 O, C
- % t) S8 {* q' l& @7 p" h* x3 Q8 g
- ;启用NMI处理
0 Z3 P) s! i$ {1 ? x x - LDA #$804 k# l% w* |" d: g( P
- STA PPU_CTRL# A" y9 \8 n0 g) O: v5 ~
- - {1 ~2 Y. ^! q8 m) Q/ A' n' @
- ;程序循环, 剩余工作交给 NMI 中断处理4 h3 C+ M, O: c# ?1 v0 {' H
- .Loop
5 Z0 ?* S! ^0 b' I3 r! `( a - JMP .Loop
) b, e$ Y; t# {: ^
. ]+ [) v! S5 r: e F- ;======================================================================$ @9 i. d D/ o3 X. _5 Q
- ;不可屏蔽中断处理4 d) t' x4 h; f! I
- Nmi_Program
# m" M+ v/ I5 A5 S4 o$ T i7 _* u5 } - PHA
8 T9 T9 T, b7 [4 \/ [ - TXA! ]9 M) Y3 V. c' N1 s- O7 @
- PHA
8 j4 ~4 M0 L+ ^) m8 I - TYA
1 ~5 a+ w# a1 q! g - PHA
, [: Q% z: V" Q B! t - / G% I) ]& `/ i. v$ ~
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位* f! b; y. b) [
- - @# q" o6 T4 W/ F9 w
- JSR FC_PPU_Procrss;PPU处理
6 s# n2 t7 X' e0 {$ e - / T! u" X7 h W, C& M( j. T) P) z6 Y
- ;精灵内存更新
# z, Q1 ]7 T: u9 v - LDA #$00
8 o6 F" I9 X, {" t* ^$ h. i5 }2 n - STA PPU_OAM_ADDR
; Q- K+ w& z7 C# ~; V - LDA #OAM_DMA_Buffer / $01008 m1 r; c1 o9 S0 I6 t5 B* ]
- STA OAM_DMA
7 `& j$ c+ y6 y4 G: `8 c) K - ) F# u9 T. R5 k* h( b
- JSR FC_Gamepad_Process;手柄输入处理2 @. j2 `, k3 i; T, S
- JSR Music_Select_Process;音乐选曲处理$ Q5 V; i& V& z) R
- JSR Music_Play_Process;音乐播放处理$ o9 E& J! f; o3 u$ Q
- - J2 d- e! G6 F9 w# S7 H) I6 C! }7 n
- PLA
/ u' i8 _: x- Q' s8 W { - TAY% p0 j* ]/ R! I( E
- PLA g' D& u8 Y1 q/ `. p
- TAX
1 G s& R) {/ R$ @# R0 t* J% x - PLA; i/ Q& n7 c0 ?. N/ \
- . A/ d a( i8 k& @2 c8 P
- RTI
: K( ^$ j1 J) R+ q M6 ~ - ! m: h3 }( w& }* N( [( q
- ;======================================================================
7 Y2 m- @1 \! p; X - ;请求中断处理
|1 W( x0 F0 K: S, s1 F6 R5 G' t - Irq_Program; v: P) V6 `/ {) h. a* F- Y
- RTI
* v( G, \2 f* @8 b5 o - ; z: Q3 X% R3 n7 Y+ k
- ;======================================================================
$ i& M/ R$ `7 S9 } - ;中断向量表. ^. C) N2 @; E. n! J+ \
- .ORG $FFFA m: Q/ P" R' O8 V$ t$ w
- .DW Nmi_Program ;NMI触发时执行
g3 ]0 w; R4 V w' k - .DW Reset_Program ;载入ROM时最先执行1 m3 \4 a+ p2 s) i: s& J
- .DW Irq_Program ;IRQ触发时执行
8 h0 M% e Q& Y9 G7 ?
复制代码 # T3 Q/ M) i4 o% v
} h* [7 ?' C& f6 ]7 h N. @: ]$ L# u- }
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|