|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下2 {: b. g9 x$ E; V

[0 D: |7 a/ b# Y2 k- L' W9 w以下是主框架代码:
: T' p. k' q- N4 a" O- ;======================================================================
1 W# q* q2 g) O8 N - ;文件头' i& `: @: i* D* f: w7 D( H7 ^
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
4 b* ?! o; y+ j" T7 g' [* Z - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
: z# Z0 v7 O( J! | - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码% i& A7 Z( p& ?0 y) x8 ?% j
- ;======================================================================& V# K7 e4 l1 {1 m( P0 x
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 23 r# Z: V% {& P O* a; K1 [/ [: A
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1: t4 m. _/ J$ w3 o" G- |6 s! d+ `
- ;======================================================================
* W2 ]3 K9 L+ O. q. f - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1( a* F7 Q) `3 C! Z3 ]& L% n
- RESET_ADDR = $E000 ;主程序起始地址 k y7 W6 ~/ D
- ;======================================================================$ q) F, n9 g& i6 S
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB$ j) K+ Q, _% X+ K
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB5 a7 h5 B5 P/ \- m& h" f/ z
- .INESMAP 4 ;Mapper号 (0-4095)
6 J% S a3 }% [7 N V, D) ]( w - .INESSUBMAP 0 ;子Mapper号 (0-15). j" q6 A Y, K7 d8 J) q4 o8 U
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
1 s( K5 I; a& E2 |7 }, w - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
( k( D0 b' \, X! I8 S; s7 H - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
# z9 n8 v( `, o3 Q' l& D& F - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
& s, y! w' H$ s - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数) Y: |( j4 O7 t7 C9 p1 ~0 W0 M
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)1 |+ ?9 a" I6 l- q, E! o/ y. A; m
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
: o$ g% U0 |; h0 S: q% r - ;======================================================================
& a# [# ^7 U2 e+ J6 A - .INCLUDE "fc_demo_config.asm" ;全局配置
! B0 V& Q! d5 T1 O - .INCLUDE "fc_demo_constant.asm" ;NES常量& h4 j' i1 T: }; Z; ~, i' j& E, S
- ;======================================================================
( t, i0 @7 t5 ?# ^. Q- x6 h - ;音乐配置+ d$ H3 D8 |9 A, b, Z/ O7 a+ f
- .IF 0 = MUSIC_THEME
, G% t& J4 T: Q, j1 k5 c - .INCLUDE "data/music/Gremlin 2/config.asm"* S5 f% y- d' y9 I5 B' J1 A, s% u
- .ENDIF) e& l0 \9 z- R
- 6 f1 K" o2 Y5 L( X
- .IF 1 = MUSIC_THEME* N# D% q' ?/ d& I! b" e% P
- .INCLUDE "data/music/Raf World/config.asm"" I# |+ \5 M f; v- K* g
- .ENDIF
" m9 m) h/ ?. f. I7 B - 4 R, }1 \8 S& O" V
- .IF 2 = MUSIC_THEME
& u+ C7 v4 g8 a# N6 d! V$ x2 c - .INCLUDE "data/music/Ninja Gaiden 3/config.asm": z+ s5 P. ^$ D' l
- .ENDIF
" v6 U t. |# m8 X$ v - 7 }: a9 h" w, F/ l- ~: p
- ;======================================================================2 I9 k! z$ C7 `9 g: C
- ;引用CHR图像数据% }- Z% L/ q4 g+ p1 D$ B# k% E A! J
- .BANK NES_16KB_PRG_SIZE * 2
9 z `! _" |- o. x) Y9 P7 O: c - .ORG $0000% t$ u+ [! \, m9 P: b4 d9 U
- .INCBIN "data/bkg.chr"
, ^, Y& e0 e5 X+ s1 ] - .INCBIN "data/sp.chr"5 e& @3 e/ F' r+ {1 j
- 2 N8 M% O, t& m' i, D" @7 g* f* N
- ;======================================================================% Z0 |; O4 e' X, y! w
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank: I; V2 M8 k8 a( q! B6 v6 x) U
- .ORG RESET_ADDR! J4 \: M6 G+ ^; w4 y# ?9 t6 X+ i, H
- ;======================================================================1 b& @6 ?" o2 |( p+ d
- ;引用其他源文件
" F2 B& B6 y5 H+ Y1 `. a5 S: F( Y - .INCLUDE "fc_demo_ppu.asm" ;PPU处理/ M; O# S! J A a$ M, G0 }
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
/ W; b4 Q0 k8 B - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
2 ?6 [6 V2 M# B6 R( R2 }: G - ;======================================================================& f' c/ M; C8 M& R8 R$ |
6 j1 H: q, o7 w3 p/ w- ;======================================================================
. F( r( v( m% T! s( w1 V( h - ;等待VBlank到来9 p# n0 I5 q: q& Z& g: ?; c
- Wait_For_VBlank; n5 E6 p' M; @* v1 q
- LDA PPU_STATUS
: q: _7 S, E0 { - BPL Wait_For_VBlank& f9 E. L: e+ @4 U8 _% z' T
- RTS! ~* W6 p6 E" ~0 H; F5 D4 {
8 \1 {4 O6 p# }* Q- ;======================================================================9 G3 H! ^* n- g) I' y+ _2 e
- ;调色板初始化& Y' Q" E: K x" L
- Palette_Init, ?' g0 v6 @( A: m
- LDA #$3F
# y& F7 [$ P0 `) G - STA PPU_ADDRESS
3 R5 b* } Z7 o" F - LDA #$00+ D2 H) i6 p( m: S3 K+ F+ I& Y2 p
- STA PPU_ADDRESS5 I1 K% U& Q4 S/ R
- LDX #$00
& {+ k; |0 [# E, h2 H7 d; t5 c" o - LDY #$20
+ Z' T7 F( b( n$ q# t; Y+ T - .Write_Data! C8 ^; x( H8 ^. V: u
- LDA Palette_Data,X
5 d1 h7 o1 V2 |6 q$ l' H1 u - STA FC_PPU_Pal_Addr,X
; e7 F7 p9 D: z5 ?3 T; S - INX5 M: F9 ?) f* Z% a: D1 V/ Z. R
- DEY7 `, f2 M8 m1 i% g, K3 A4 O" X8 o
- BNE .Write_Data
7 W$ p a5 z1 v - .End
2 c$ S# O- g# L/ Q- e; S3 r) l - RTS
7 R7 X# M6 N- ]5 ?# S5 ? - 2 L# S/ t8 u1 }9 \* ], o: J
- ;----------------------------------------
# L; J% l) c2 j* \6 l3 q - ;调色板数据
. R8 z+ g7 D$ q' C/ _2 u - Palette_Data
6 U. v* x* @% Z3 r - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B/ a* X! a8 E2 y @4 ~1 y* s& F& D
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
7 ]' e$ J/ e0 z2 b# \! g: g% H. E" f -
, q$ f6 m9 _5 } - ;======================================================================" k; l8 T2 o. _$ @# R
- ;命名表清空
, M* O! O- x" R5 C% @ - Nametable_Clear% z; j" q1 \7 I7 V. `# r! C$ S* Z4 Y
- LDA #$20+ a+ M, j5 H7 Z2 {! L$ @( R
- STA PPU_ADDRESS
; `. M8 R( D* x, M - LDA #$00
7 |8 ^+ f+ F) u9 e, X - STA PPU_ADDRESS/ T4 p' t* z1 \9 ]
- LDA #$00. X6 y) G W/ L1 W K- g
- LDX #$00+ g% \1 l4 w) U( a3 @' r- p
- LDY #$086 U6 {! s: q5 L% J
- .Write_Data9 g" E: ^3 T" Y: Q. i
- STA PPU_DATA
& K. X* o4 y1 m. m; x - INX
6 w- ^4 r9 ]1 c# [, c" | - BNE .Write_Data
0 u1 Y7 v; `" }7 j: \; m+ l - DEY9 D, l# b* k* r& i. m3 o
- BNE .Write_Data
m, ?$ E# O% K L! L - .End
, H2 {9 f0 E% q0 w - RTS) @2 B( R* {2 N8 ]( K/ W; p' u9 p
- ) h7 `# V! G2 v, \+ O. a- `& T9 n
- ;======================================================================
) [/ c/ F- n8 X i - ;音乐曲目切换
5 L; L/ r) k4 d8 v0 W- l - Music_Select_Process8 k( h0 B- f- B- G1 A1 C
- $ [' c1 [: ^6 @, [ q4 T7 K( u
- .Pre_Music;上一曲
) b' l$ \" T n) Z( T ^- T$ U9 w - LDA FC_Gamepad_Once
, z4 k2 T& g4 b$ l9 E - CMP #JOY_KEY_LEFT! y# B: w* g+ D2 ]0 G+ S/ [$ G9 P
- BNE .Next_Music
5 S# \" e) Q) t- P- Y$ Z - JSR Music_Play_Pre
; I$ \" d! ~$ y- M) a# a$ o - .Next_Music;下一曲6 G9 i5 K. u' i
- LDA FC_Gamepad_Once% }! z4 q1 |' ~) s+ K
- CMP #JOY_KEY_RIGHT7 w0 b8 Q. f3 r3 K
- BNE .Next_10_Music
$ F6 B0 ]- k7 L6 X, ?! { T - JSR Music_Play_Next
' _1 ?5 T1 Q# ?: ^$ Y3 J& V - .Next_10_Music;上10曲7 Y" M: @+ x7 N% t% b0 k7 I
- LDA FC_Gamepad_Once
$ b" \: `" A' Z3 k# [ - CMP #JOY_KEY_UP2 ?) @7 h! ]& [; `) d& t
- BNE .Pre_10_Music
" D& m: W) h: w - JSR Music_Play_Next_10
# v) \" ?6 T% F% q8 y; P5 G - .Pre_10_Music;下10曲% @9 s4 ~, p |5 Y
- LDA FC_Gamepad_Once0 t' M% s- G/ H# ]' c
- CMP #JOY_KEY_DOWN6 B+ D2 Y( U* I8 ~: A# C
- BNE .Reset
0 `0 P: M9 g. ~3 h# D2 m - JSR Music_Play_Pre_10 G+ z) ?/ y) e5 q/ J: D, z
- .Reset;重播当前曲目
: M( ?" J! ?# x5 E - LDA FC_Gamepad_Once
) E/ b1 e, M3 [2 W - CMP #JOY_KEY_START; e5 d5 ?3 w/ V0 X
- BNE .End1 ^3 r. y+ g5 X
- LDA FC_Music_Index
2 l" g; K! h* Y3 ^4 P; b - JSR Music_Init_Process6 [% [6 h: Y# |( {8 E
- .End9 m2 u* H! z( t: b8 a
- RTS
; R# m9 ?: X) P; \4 x* g
% J% o$ a& ?- y% {( c7 Y8 s- ;----------------------------------------------------------------------
/ F3 b8 A. f: [0 r3 \5 G6 i& X - ;播放上一曲
0 b4 b& F- F- V N; m1 W" n - Music_Play_Pre
0 B. T7 e q$ a2 l/ w/ f5 G - LDA FC_Music_Index
& U3 c( _2 z# U& ^8 @( L7 W4 @ - BEQ .End
5 F! V* P. L% e3 s - DEC FC_Music_Index) i4 P# G% t( K# z+ x" E
- LDA FC_Music_Index1 H) a* U; h: y* I$ i
- JSR Music_Init_Process
5 n9 L- m( a/ k* E6 j- { - .End
3 f7 v9 Y! Y% `5 b8 C/ L7 Q - RTS2 s- G( v) J8 o y3 T. Y
- ;----------------------------------------------------------------------
& o2 k. |. J: z* k, s - ;播放下一曲
" b2 l0 H; F$ o; U" f - Music_Play_Next! Z z) u" s2 i3 `/ r+ g V
- LDA FC_Music_Index8 T( j, B& n0 h2 A
- CMP FC_Music_Max_Index
6 u" w% K- P: U - BCS .End% b3 l% k. z0 n G
- INC FC_Music_Index. u: e6 j+ Q4 U* Y0 \
- LDA FC_Music_Index. ] E: s' E+ z$ E' m8 O' Q
- JSR Music_Init_Process
' ~; D l+ e8 M- J$ G1 f/ a0 i0 k; K- r - .End
1 k; g8 d1 Q- o, x - RTS% C) w+ S/ P* |$ A! z4 Y. |7 T
% y9 O* C: f5 ]& J- ;----------------------------------------------------------------------# p+ J7 u. s5 Y! c6 W' U( A
- ;播放上10曲2 P4 V" F0 i1 H3 R
- Music_Play_Pre_10
5 C' L1 [! O) ], R - LDA FC_Music_Index
2 u7 C$ D7 X$ I - BEQ .End& m! F# _6 w4 Y( E* L5 l8 p4 ~
- SEC
. j- | R5 w4 c3 [: l, q$ b# C4 I2 I% u( r - SBC #10 p' B, l* h" R% F* G% D( }" z# m
- BCS .Pre_10* {: R5 ^; E+ g$ Q" ?7 I9 p6 {
- LDA #$00
! @/ S6 [3 ^/ Y. H) i* c - .Pre_10# t6 p0 B7 I) E
- STA FC_Music_Index6 t, N6 Y# S+ J' I0 ~
- JSR Music_Init_Process1 i0 y& v. D, C ?9 p' K n" i
- .End! q) X' L3 T- w6 C% o( _- z8 U7 _
- RTS
+ O1 @1 A$ }2 L# t3 |9 [ - ;----------------------------------------------------------------------0 W7 K5 r' { l, ^3 B$ [
- ;播放下10曲' n' H. W( _ z, M
- Music_Play_Next_10
, W+ ~/ E+ o$ P( s! ^7 |3 ? - LDA FC_Music_Index
' z ?2 x- O: @, ~+ o* c: r3 z9 a - CMP FC_Music_Max_Index
5 m, g1 E2 N4 f; Z5 t0 S - BCS .End/ D7 f: ?0 M4 C3 i+ J8 u6 I
- CLC5 k9 K# I# f K0 W
- ADC #10) h% L$ _3 t6 G5 G$ ]4 o
- CMP FC_Music_Max_Index
, ]" Q. r, n5 v% D3 D5 [5 T - BCC .Next_10' t; N! C& q* H- K' Y
- LDA FC_Music_Max_Index
2 x) M6 G0 D) T2 d1 P: u - .Next_10" D ?1 G- {' C: _2 O. ?
- STA FC_Music_Index
( b% V+ C; D; b! k) m# h - JSR Music_Init_Process
& [8 v; g6 G( p; c, U3 Y9 H4 ?) z - .End; g! w: L) D) O/ W. t
- RTS
B. F: e+ N! c8 q5 g. N
; B3 Z6 d) k; p* V7 s- ;----------------------------------------------------------------------4 T5 s% J) W8 z l
- ;8位十六进制转3位十进制制& T/ s- I! d. t! X) n) N
- Hex8ToDec
9 u( J$ H7 Q; Y W2 ~ - STA FC_Dec_Data_1
L. `& V1 n2 s3 C* b - LDA #$00" } c' D4 @! @1 R) D1 v# d
- STA FC_Dec_Data_1008 ~1 ^/ R7 t {! M
- STA FC_Dec_Data_107 e. f# U; ]* z. d6 B0 K0 u
- LDA FC_Dec_Data_1+ O+ G2 q- V$ `
- .Convert_100
( G* X6 D* ~1 E5 i - CMP #100
7 p! u/ i8 O3 r0 Z% |+ ~ - BCC .Convert_10
: O! B' |) b0 \' W, H2 i - SEC
' u7 Y7 H' J# k2 a/ j6 _ - SBC #1004 G4 U' K3 I7 E' J
- INC FC_Dec_Data_100
5 [+ o# k3 }' d/ V( w O - BNE .Convert_100
* y# b4 o* e' g) w7 ^. B - .Convert_10
9 \+ H6 b2 X3 d; { - CMP #10$ q& V/ h( {/ M" s- |( B
- BCC .End0 t& Y/ T5 `& v# f4 U
- SEC! K! ?8 R; f+ O C
- SBC #101 @; E n6 s# X4 Z& p
- INC FC_Dec_Data_10
- i% x/ B+ l8 t2 H; ]1 K - BNE .Convert_106 b) ?; E/ Y" T/ o
- .End* ` H. L& t* {3 }6 p" B* f
- STA FC_Dec_Data_1
. n( z- I) r' ]0 [- g Q - RTS
' A4 z; N7 C8 K/ _4 q& f6 _6 n$ o+ B! R
# f- ^1 t, }; U ], f- ;----------------------------------------------------------------------
9 H" K# T: y' @0 e - ;显示曲目信息% r4 V( r& `6 }( [( l: c: r! z7 X
- Music_Info_Display5 p7 u, ?5 ]! ?3 o
- LDX FC_PPU_Buf_Count/ M( C/ o& u) r W
- LDA #PPU_WRITE_MODE_CNT_LINE( q- C" j% ~) Q# A7 J# N& r& d+ X# N; z
- STA Use_PPU_Buffer,X) {& M& s4 X8 t* d' G% Z* f+ b; y
- INX: X' w) b$ T8 o3 _* Z! I
- 0 C9 O% p$ j2 d: X9 I# {3 D8 i8 O! U
- LDA #>MUSIC_INFO_POS D9 X" O2 b' f* E
- STA Use_PPU_Buffer,X# ~4 P1 V$ J; R% c5 L4 I
- INX3 O5 d5 k; S% g2 N
- T& c5 x* q$ `) d' i& T
- ;居中
9 \2 F1 \# X! ~; J - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
2 M# N d ]. v: F8 i2 H7 y1 f" ] - STA Use_PPU_Buffer,X% T7 `/ B+ I' X8 P, v
- INX5 T$ x: K9 U* x1 K! u! H
- 5 c0 c. Y- h- G% [$ s
- LDA #$05
( X6 L: D' p0 _: X E% Q - STA Use_PPU_Buffer,X
! c( U: E* U8 w0 G0 T. V( m4 G6 ] - INX) P N5 O0 V* a) A/ H. R8 K! @5 I
-
4 d6 B3 |9 L3 M" O9 t g3 R5 k* ` - LDA FC_Music_Index8 i" v2 k( f2 x2 `$ J; S
- CLC, H* y3 A# _" c
- ADC #$01
, y0 j& N) r* f U5 s - JSR Hex8ToDec5 L- s" d+ Q1 w" z; r
-
% a# P$ Q% k" J" @, b' M8 V - LDA FC_Dec_Data_10
6 V1 P# u7 T( t. R7 u4 \* U4 K - CLC" Z O5 K7 Y7 E! O
- ADC #'0'
7 E' r9 U- u5 I. u% W7 \/ o" Y6 V) o - STA Use_PPU_Buffer,X+ h j/ A8 i; I; c8 S& {7 F
- INX
4 b% r% O+ _: ^- N4 |" P - s& G1 D5 B0 T# U- P5 D" F
- LDA FC_Dec_Data_1
5 q8 ?* ^, n) A7 J- y; X }. q* i* a" p - CLC: b' E: c+ K" F* c& o; Q
- ADC #'0'
0 L* k6 o/ S1 C - STA Use_PPU_Buffer,X3 S! g$ M/ \% |+ S
- INX
6 S4 a: L! k2 V4 C) U0 b -
5 g5 w# M f- a& p$ r! Q - LDA #'/'+ T' j& D$ x$ M
- STA Use_PPU_Buffer,X
( |4 V e% F( Q, ^% {/ s - INX
; W H3 j5 c" E& _- n. ~# f - - ^* r9 [; Q" G, A
- LDA FC_Music_Max_Index) Y7 u& t( {, o( ^% a
- CLC) J- j0 b1 y5 @3 g
- ADC #$01
. ]* B1 X Z% C1 b. F - JSR Hex8ToDec1 A: a0 E$ D e3 t
- $ E! P3 J' W. K1 X; J
- LDA FC_Dec_Data_10, x, {: s) D* ~( R+ O& t V
- CLC7 I% H3 ^; @# i7 s3 u0 _
- ADC #'0'
' S8 J7 S$ l9 u( o3 h, P - STA Use_PPU_Buffer,X% n4 c4 {- ^: g. \9 r: q. i
- INX
" v1 Q: K" H; ?4 K - 4 b) d9 h V+ p
- LDA FC_Dec_Data_1
. h" {. U! P$ y4 n4 ^( W - CLC
; D B g3 t9 h8 p9 E! S2 H - ADC #'0'4 l- I; s. i; X6 ]5 @5 ?, F! P: @
- STA Use_PPU_Buffer,X; |7 } e+ C8 u- f) C6 V6 G
- INX( q! w. W6 W9 s2 X6 P; E
-
h( v: T1 c5 [& ~4 Z _) I - .End
6 t! ] \' {& I& D3 Q/ u - STX FC_PPU_Buf_Count# X/ H$ o# \5 z0 \, I0 @% E
- RTS. [# o; s# g% v+ R' }- @2 z9 v, p# o
5 A* G' ~6 C* A5 {: x( E- ;----------------------------------------------------------------------
3 \$ O1 t8 P3 P0 ]2 l. W - ;音乐曲目初始化处理
* [- e+ |2 w( h4 s: B" P - Music_Init_Process( k# K4 W6 E% H N2 w
- PHA# B9 \7 h$ R ^
- JSR Music_Clear_Process& ?+ o+ Q: z; ]+ d) V3 w
- LDA #$1F& _: O$ G1 t7 G8 }& |+ ]' r
- STA $4015
' E% v+ p0 _) z7 ` - PLA
5 p. W: S6 s* @4 I, z# L1 n, G - JSR Music_Init_Addr
+ C! A) B& H6 S" T - JSR Music_Info_Display* p; G% Y5 t0 u% v5 l
- RTS
- O) |5 t' h1 Y: L, \- A4 J
2 l0 U* ~: m$ m* w- ;----------------------------------------------------------------------3 F3 k1 V8 @0 U, @3 l
- ;音乐播放处理
- x w7 V2 H" r - Music_Play_Process8 S0 C- |! ?3 o9 _4 I
- JSR Music_Play_Addr- H; d- l Q+ ]5 N& l/ k; W
- RTS! w1 F# T2 n8 W! p( k2 R$ u
+ k4 @2 ?' c1 \* V0 S4 D0 f' h- ;----------------------------------------------------------------------3 z7 Q) D, y) K' E
- ;音乐播放处理5 J- r- Q% m3 k6 T% P
- Music_Clear_Process& @; {* |& `" F3 S% j ^& T9 D
- .IF Music_Clear_Addr, w \* a; Z$ A2 W' `
- JSR Music_Clear_Addr
- Z$ Y9 Y. J7 S+ [! o6 _' m$ x+ ? - RTS9 N p# }1 q' [
- .ELSE
4 t& G: k' N% c8 | - LDA #$1F8 t- ]% n! G. p w
- STA $4015- u8 m3 a$ v+ S/ F
- LDA #$00
( g/ @3 ?6 Q o# W) L - STA $40103 V1 H: f" N) e; }
- LDX #$003 F6 A# W1 G# ]6 i% x) o7 s
- LDA #$00
4 `, F& v6 F6 \/ c; f8 ^( L - : V' _0 l, e1 `
- .Music_Clear_Zreo_Page_0
2 w; ~$ A v/ H; T2 a* \0 R* \ - STA $00,X5 f$ z, V+ \6 |! O4 |& n1 o% }7 B
- INX
1 N$ F6 n# {: `& t" x* ? - CPX #Use_Zero_Page_Begin8 @8 j7 {) M) s. k/ s
- BCC .Music_Clear_Zreo_Page_0
4 G$ I. |9 z# d5 R1 O+ I: Z, Z - 7 b R& ]& I2 e
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
9 u' T( w/ v: L3 L8 N4 J* j - .Music_Clear_Zreo_Page_1
7 l- j* v, X$ |9 m6 w) i* {; N - STA $00,X) G) d% P$ |5 G/ {( Y) S
- INX6 ^, a" ~. C( W9 x
- BNE .Music_Clear_Zreo_Page_1
9 d( z/ v( K2 q+ e# {! C- r& u1 t - 5 O: n4 |1 K5 f* S/ k4 ]" p7 s
- Music_Clear_Process_1. f6 S. ^- [" g/ I$ O; O
- STA $0600,X
. B7 H6 T5 j+ B A7 j$ q - STA $0700,X5 H7 ]- `, V7 }5 D( b- `$ W
- INX* O2 Q: r4 O4 n4 s( F" L
- BNE Music_Clear_Process_1
: U* v& x& b0 K* v4 n - LDA #$10
, m: [7 b! U3 [$ j$ z/ ?7 R8 Z - STA $4000; ~7 g5 i1 g# n3 a9 {
- STA $4004
: w5 M+ c! n' _" _% R - STA $400C' {8 \4 T* ^, a
- LDA #$00+ u' p* `7 _. E8 C9 p4 p! c8 O7 {/ g) f
- STA $4008
% f: v" a$ L3 W! [2 p2 L - LDA #$0F
# K* h8 c3 n4 t9 w1 Q5 I2 W, Z n - STA $4015
- a7 q0 C2 r ] Q6 y - .ENDIF
- M8 I9 F6 ~* q3 J -
8 k/ [& d2 r) P- S - RTS D& ~+ |! i# N" ]! M/ w, Y# C
- ) _! u5 U" \5 ?* l3 K
- ;======================================================================
3 x; d& `6 l4 g% W - ;重启处理9 N) u Z8 `1 ]9 [3 U% [
- Reset_Program# [* A! m& T6 W2 @
- SEI
* B% k/ ?* ~2 \' A8 j' y! O( Q - CLD
3 x; C9 r: V- B1 P - LDA #$000 ]* n/ K7 V; O
- STA PPU_CTRL
R' w; {: q. B - STA PPU_MASK) L7 [$ n- |/ j% G; T( b
- STA JOY2_FRAME
! v* T+ c: u0 t5 u - STA APU_STATUS5 P, ^8 V" W7 g
-
! l$ q+ D4 z# ~0 h0 B+ K$ {, l - ;等待屏幕准备完毕
3 P- k8 Y7 z5 ?6 M! \ - LDX #$02) A- h/ v! E D, z, T
- .Wait_For_Screen_Ready
. L! R0 S5 M' ^, Z% U6 u( _ - LDA PPU_STATUS8 M5 A" h2 ~5 C5 x; O
- BPL .Wait_For_Screen_Ready
9 T+ }, n* R$ R7 I1 D) }/ R/ }" M% S1 p: W - DEX
3 i( |6 c; |( I! T- v8 n/ e# _ - BNE .Wait_For_Screen_Ready
0 t# `0 ]: _2 y" p6 |& W( s -
. `2 W' h/ @( \ - ;清空调色板
, I: [+ e1 P) @' B j" K* v! _+ f - Palette_Clear: b( `: ?: V9 w! v& v" P
- LDA #$3F
# r- b' }( a. l - STA PPU_ADDRESS" q% J& {- l. G
- LDA #$00
1 ^9 A9 b. e. V# F - STA PPU_ADDRESS
$ {2 O4 R0 k6 Z7 j' a- W& R3 r - LDX #$20
7 j( Q; N* M- B$ p8 f - LDA #$0F
4 ?/ Y0 `( g' @/ x, ~- q: U - .Write_Data ~( E8 Z- j( ~5 m% S3 F
- STA PPU_DATA
* ^. q2 A# f! s' P5 w - DEX0 ?. b$ G! b, y/ j* J1 F
- BNE .Write_Data1 Z5 r2 u: q+ F; j
. ~5 f, J4 q6 D$ g! ]6 v# E! e- ;清除声音 $4000-4013
8 u# ~+ [( I J - LDY #$14# O, l, r. m3 m* F& @/ w
- LDX #$00% a5 M( W/ B8 D# P( \% I5 t7 ]4 [
- .Sound_Clear
7 P$ Q9 I* T6 n k" b, v - STA $4000,X @. z: m7 g6 i: e
- INX
/ ?- t# [0 z7 X+ Y ^5 A - DEY
' {) G8 M1 L8 i# `0 m) y- U - BNE .Sound_Clear
: I% u$ F. j* t6 x! n) j0 Q/ { - 7 J* Y' h; e, b# a3 B' Z: D
- ;清除 RAM $0000-07FF
. U+ d4 e9 d0 i2 j0 t+ i' Z: T( [ - LDA #$00
3 a' ?$ P5 ~8 b a7 F - STA $00
1 ] n$ T" R3 N3 {2 I0 a - STA $01
- T3 y' o# k! @% _9 ~ - TAY
" e* N$ B/ t" G9 a( Y1 }, ^- q" I - LDX #$080 ]/ y5 m4 _" P8 U
- .Memory_Clear, L% @4 t1 n) A0 M
- STA [$00],Y
# O) ~" Q6 x" T+ |! m2 L8 k+ z' E$ _) c - INY: s6 f7 G$ c9 l0 h( z' m
- BNE .Memory_Clear: l& ?+ a/ r( t9 f
- INC $01
! r/ g$ [/ c6 g7 A+ F6 f - DEX; R% _9 {+ t$ N( r
- BNE .Memory_Clear
6 J& {3 z: N! r$ I l -
$ j3 g1 e" P$ p4 O* M, c( C; q! R - ;精灵缓冲初始化
- P2 ?. {# x& G - LDX #$00, }/ U! B% R" d; K8 L x
- LDA #$F8
Z5 w1 m* I$ Y3 l1 k - .OAM_Clear
9 d4 S; }6 C) R, p7 D) b - STA OAM_DMA_Buffer,X% U" P$ N' \' p$ T. l2 X
- INX% l2 J* i7 ]( y0 C) J8 o' c2 h, O( q
- BNE .OAM_Clear
- z8 P3 F- i# A; d* V3 O0 w! K -
' e4 L8 `) N5 q S/ A F: I - ;栈指针初始化* c$ \/ k& I) P! n9 Z* t
- LDX #$FF# r! t6 f( R" F+ ^6 x
- TXS1 E8 ]8 H% B4 {
-
+ K# \ w$ Q. e4 e+ Y+ z. t - JSR Nametable_Clear;命名表清空
, }4 s0 P( B' [7 h5 ~1 `! K - JSR Palette_Init;初始化调色板缓冲
, F! r: R, A8 E: f - JSR Static_Text_Init;初始化静态文本
/ q7 _3 g: D: F& Q8 p% Z3 j$ v - 9 ]+ f1 T; z2 o! M1 K* ~" [4 v
- LDA #MUSIC_ITEM_TOTAL - 1
9 h, U9 M& Z) M* a2 } - STA FC_Music_Max_Index
4 _: `" l* t8 N9 a, z3 ]2 e -
$ o$ n9 t8 \2 k/ \ - LDA #$1F
4 r V- F; a2 d4 H3 Z/ K" x - STA APU_STATUS' g5 [2 O8 R6 N* ~1 _. G
- LDA #MUSIC_BGM - 1" M y0 L" Q6 R% ~7 u6 h) D+ J" a
- STA FC_Music_Index
! r) q9 \" _$ {; g P - JSR Music_Init_Process;音乐播放6 R* Z8 _- H% }
- ' ?$ {' e# A: Z z1 c9 Y& V
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
- d* i W4 \. n) F3 N g& p - LDA #$1E
4 K7 B3 {- s3 X& w/ K. T, {( i - STA FC_PPU_Mask_Buf
_- `' }- P; ~ - * n) p {, _! j7 b0 \* b
- ;启用NMI处理& R8 ?; e$ F |% P, T
- LDA #$80
( Q& Q' k; G+ J* _! S2 u. O - STA PPU_CTRL0 k7 E2 {" f7 d" g2 t; }
- # K0 V2 x7 V0 p( B: F8 }/ N
- ;程序循环, 剩余工作交给 NMI 中断处理
1 h% n v+ v5 w) G" J+ n% B - .Loop
7 [" y$ B' d1 l - JMP .Loop5 c' H8 c1 d5 P4 T0 s& ]
+ Y% F$ ^, q6 K. f- ;======================================================================
+ M& P8 s/ l2 V2 A5 l: {& ^8 J - ;不可屏蔽中断处理4 p3 l8 p; S e S/ w" ^' Q
- Nmi_Program
. h/ ~7 j' D7 k9 ~9 e2 U U - PHA
5 I# D$ E: [5 D" W! q7 l - TXA" P! ?9 k5 ?. s' w: @& ]
- PHA; r* S0 |( h' i. Z
- TYA+ p5 O! D$ G, {9 w7 ^7 G# s, N2 M
- PHA
( S/ ]+ g( \+ Z -
4 W. Y# S" h U$ L* Z. Z3 P - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
" E* s3 n+ {7 `: u) }& ~" ^ -
6 x5 i5 W/ w+ H5 B0 J; h - JSR FC_PPU_Procrss;PPU处理# Z3 H; v6 r. v0 W5 c
- 2 s/ F; X, S9 y; Z# K
- ;精灵内存更新
/ a4 u. V/ L% b4 R" D* G - LDA #$00
# Q2 Z) \4 C1 U7 E - STA PPU_OAM_ADDR$ G& N; P4 K/ C% ?3 @ L. }5 Z3 ]
- LDA #OAM_DMA_Buffer / $0100
$ M+ t; V; I, M' C6 c3 M p - STA OAM_DMA5 b1 Q- z3 |' P x' X0 e& w c
- + P7 |+ H$ P' x* a6 p' ^
- JSR FC_Gamepad_Process;手柄输入处理/ _6 y% f/ Y8 V" H0 w; D$ B
- JSR Music_Select_Process;音乐选曲处理8 @ Q; v1 S% j6 w) N5 k
- JSR Music_Play_Process;音乐播放处理
; G( I8 J& p/ ]2 G) U -
6 }% J0 `$ ]: r) V4 W - PLA6 O/ g/ U" T+ _/ K+ x2 J" W
- TAY
+ z& [; c2 l" Y) v/ ~' L" C6 b - PLA
9 z& l" P+ K4 r( \ - TAX
5 m! N0 {" C6 L3 z. K; K - PLA
' t* z- B' A" V$ Z! H) F9 Y - " G! h1 `! R) S7 d0 \3 E, F' }' T
- RTI
: D5 C9 j5 Z" W- f - 8 {0 I/ t1 g6 e/ g: V M; s4 I
- ;======================================================================
2 {+ j+ i; F: p0 j8 R: B. h - ;请求中断处理
+ ^! v: j& I3 ?1 o& \8 |7 x" Z- { - Irq_Program2 G# j4 W* e" ]9 e# v
- RTI
- Z; X" W4 _% G
8 L$ [, _: s2 i( Z& W; f# {- ;======================================================================3 ~# H1 h: k$ }! N" {2 F
- ;中断向量表
" ^1 c6 c. X E" @6 A - .ORG $FFFA
: m3 j& X# p3 v/ r: ~: { - .DW Nmi_Program ;NMI触发时执行# Z+ A2 u" e1 m: I/ U, Z$ Z; ~
- .DW Reset_Program ;载入ROM时最先执行
; i" g: z0 m# v: ^: {" O# Q9 n - .DW Irq_Program ;IRQ触发时执行1 y' B+ h2 ?; e0 ?2 f& x
复制代码
/ q4 d5 x6 H* a" m+ w) O ~
$ ?/ H; N. f* s6 H: H7 v/ W, ^8 z+ r0 K
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|