|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下% G: N N3 ?1 ?$ b6 f% [" n

2 E5 U' s/ W: W6 Q9 \" _以下是主框架代码:
; e f2 u; W) H! R- ;======================================================================
% x% b2 J, D; e - ;文件头
' ?# O! _% \) S - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
L4 a! Z) M# y$ V w9 u - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量* j( j* s1 O1 R
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
5 n; P8 c/ g* \5 ] - ;======================================================================
: k: ~* r0 o' S% b - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 29 V! q/ { H: |9 N3 u# F. g
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
9 r; P: n7 v Z6 L& }9 b - ;======================================================================( _; I" A6 Y- Z: [8 r- q. s
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1* q) y! O/ g) P$ k/ U% [! n) E
- RESET_ADDR = $E000 ;主程序起始地址
! q4 _ p. q, `* D4 h. r - ;======================================================================
5 a( @) ]4 d g/ _8 g6 C - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
* Z% K* ` f; q7 U. [" W - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
8 z5 s. F) v+ e- Y - .INESMAP 4 ;Mapper号 (0-4095)
$ h! i6 O& D) H, B - .INESSUBMAP 0 ;子Mapper号 (0-15)
; a8 s8 `; c6 R+ n& [ - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)' K/ r5 C. A* c; P `' `" U
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)0 D$ [4 b& E1 J# x
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' Y! N9 |3 Z- z5 E( G7 j5 T
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
7 \4 Y( \" x# t" n! _; U) O - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
& j* j& x! M& C - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)" Y1 N4 g/ {# `
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
$ n; J# l( j' i: g - ;======================================================================+ N) ?6 S$ U+ T U
- .INCLUDE "fc_demo_config.asm" ;全局配置
" p- J* b& O4 T. k: m; B, Z9 D. w - .INCLUDE "fc_demo_constant.asm" ;NES常量
, `2 a6 p m/ [: i x' ~ - ;======================================================================
y& V# T$ n p) D1 W - ;音乐配置
+ c9 D* B- d8 a/ a2 q - .IF 0 = MUSIC_THEME
, }% r# P' J9 l) B' V: q: R4 I% C+ K - .INCLUDE "data/music/Gremlin 2/config.asm"
1 y' F* G* Z3 X: r - .ENDIF; h6 |$ W" {4 \7 I! U5 w) b
- 6 T2 ` G6 Q- G
- .IF 1 = MUSIC_THEME! `9 i( Y0 P% C" ^" `
- .INCLUDE "data/music/Raf World/config.asm"
4 p. Y3 Q9 k0 ? - .ENDIF
9 x( Y9 g N- J, @7 _; d - 7 e- A2 u) H: y! _
- .IF 2 = MUSIC_THEME
! Z+ I s+ W8 V$ Y - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
. u/ L6 u& k/ Z( }5 C) t - .ENDIF3 T! h ^5 }7 x7 w- V. _6 I
- A2 k! o0 k+ m9 I* j6 I8 }, U- ;======================================================================# {* l4 ^2 X# t7 J
- ;引用CHR图像数据 R. I3 R/ {# A$ x4 g1 A
- .BANK NES_16KB_PRG_SIZE * 2
! i j) _; a& |. t7 h% R$ t8 g - .ORG $0000
8 l1 M0 m: F4 Q/ G% x+ \ - .INCBIN "data/bkg.chr"
) z$ W2 h6 u+ v4 l - .INCBIN "data/sp.chr"
! V( \2 p5 P; b8 I -
( D# `$ J$ m3 E% a - ;======================================================================
: L" V" ^# c9 ^0 ^0 ]( Y+ i& ` - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
/ \( @7 R. a' V& T! D- g7 | - .ORG RESET_ADDR a+ ~! ]; X9 \/ W4 e9 j
- ;======================================================================, Y) i7 g+ Y& r, t8 E3 R
- ;引用其他源文件: u U" r& s) |8 L7 O G1 Q# N
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
! L. K. o5 g( |$ }' W$ o& P. z8 u7 J - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理' B) @- b+ g7 R. x. l
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
0 z# B# H8 p9 c: y/ [" f3 s - ;======================================================================
6 @. ]* T0 c1 v. p+ B3 A
`; W+ ]7 l2 S2 M6 Y- ;======================================================================: J. D+ p7 L' l7 `+ q+ i
- ;等待VBlank到来
- v, V: z$ L0 V - Wait_For_VBlank" B# r8 t$ \: [) m8 h2 Q
- LDA PPU_STATUS
% N1 b1 @' p2 g0 B. O2 x% F4 q - BPL Wait_For_VBlank3 l) x9 i/ y; U* o1 z( g
- RTS& s1 L1 V* M$ c5 l, H1 v, c- y( g
: D' G; t: j3 x- F7 o% ]! k' l- ;======================================================================
% g5 _" `7 i1 i% b& c - ;调色板初始化
. \2 Z+ E, Q, o9 q% U8 P - Palette_Init, Z0 ~+ d4 N7 q( h! g' u3 Q
- LDA #$3F; E+ h* V2 f) h" l/ Y
- STA PPU_ADDRESS
2 F0 ~8 G( W5 M, G- x9 m; v- x" x/ \ - LDA #$00
$ z$ G9 i! L9 ]/ }: f& c - STA PPU_ADDRESS
: n$ U9 e- h( @( P7 Q" A" B - LDX #$00 `! X2 t# e1 d/ k
- LDY #$20' j/ n3 A% L/ M L1 _( C) I/ {
- .Write_Data
1 G2 c2 @) T3 i! v' Y - LDA Palette_Data,X
/ U9 D1 Z0 Q4 W - STA FC_PPU_Pal_Addr,X
; |6 X- X: `6 W4 J, o - INX5 d3 `9 b, f1 J7 f, G- o
- DEY% s5 O( f! k0 r( Q3 h$ i; ?- d2 `
- BNE .Write_Data
) m" p$ f8 A2 x5 s - .End
4 y0 T3 W! E4 ~) I: x$ L3 \ - RTS
& s, B A7 T( {% H* v; z* o/ h5 ? - 0 ]6 A z/ |+ |8 ], w& j4 u) @
- ;----------------------------------------
- e, M5 z) K# B - ;调色板数据
+ z2 I0 g8 ]: B3 @ - Palette_Data
* P0 D# N- w% T/ Q - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B$ d; \/ k& b, \2 f" {* b
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
8 e. y! D1 y) A+ [8 L - / `$ a6 z( e7 n% p; I
- ;======================================================================
/ D8 R! h$ u$ G9 K. g - ;命名表清空
; B& I4 g# l- t - Nametable_Clear2 n& P. Q& B: U
- LDA #$20
; U6 H. N2 `5 c4 c, P; Y: E - STA PPU_ADDRESS
( M, ~% b6 X3 i: s; {) T - LDA #$00
% K8 S1 m b: A1 Z8 ]: l - STA PPU_ADDRESS2 K8 Z$ Y3 P5 H5 \
- LDA #$00
$ Q6 c, }% z7 S% k8 u: l5 N - LDX #$00
: t) @" E7 c; D6 {. [# Z3 M; ] - LDY #$08( q$ @* k' G8 K7 s5 F
- .Write_Data
# a) n- A" K/ m - STA PPU_DATA
: S4 Z1 @* _, U; m- y! M - INX! N& `. C5 p6 l
- BNE .Write_Data/ ]% y: m6 A, ?% o: H
- DEY8 \; f& X6 y t( T/ w I* e
- BNE .Write_Data8 }$ _% a. H( W4 N6 M2 j" ?
- .End
& s* D+ y: _/ G8 `1 i - RTS
8 `: e) x6 c4 L
$ W& X" V! Q+ }; T+ {" O- ;======================================================================8 _' i% C. o n, v9 L
- ;音乐曲目切换
( x7 X* |$ q, y) f% G8 E9 N - Music_Select_Process
- Z( F7 H! Y7 r; n) A( l) q2 ~ - & V3 q9 _4 a- E3 h9 O
- .Pre_Music;上一曲/ F5 b# t) I. o! @! _8 u- q
- LDA FC_Gamepad_Once& B% ~0 j+ V1 \( u
- CMP #JOY_KEY_LEFT) D) C4 f: \: j) P! b" @6 T) {# D: I
- BNE .Next_Music2 F f! ]; [' \7 b6 j4 L# T4 D
- JSR Music_Play_Pre
. q9 z8 y/ W g$ E k+ X$ a% n - .Next_Music;下一曲
+ b' l' ^1 X: k+ f- D7 M% F - LDA FC_Gamepad_Once
W R% g) k/ I - CMP #JOY_KEY_RIGHT5 S2 i& r, m/ K N3 L6 j% }
- BNE .Next_10_Music3 E7 f) s$ L" K; N1 @
- JSR Music_Play_Next
) X! d0 d* {9 v7 D7 e - .Next_10_Music;上10曲
. F5 a/ q3 {# T7 ]+ i' ?! p - LDA FC_Gamepad_Once; U8 q8 V6 Y$ w% B9 z2 y$ _
- CMP #JOY_KEY_UP/ f/ R3 b. w% V f+ E: z0 ^% U
- BNE .Pre_10_Music: L* }4 a7 m! ^; L' |6 u
- JSR Music_Play_Next_103 ^9 x/ G" c( ^+ s' F9 H7 Z" j2 s
- .Pre_10_Music;下10曲) t" @; N' J$ `" x5 H( U2 V; d3 k4 l
- LDA FC_Gamepad_Once
* q6 [! o4 J+ J5 G9 y( G - CMP #JOY_KEY_DOWN
) q1 I" ?/ F- N! [) v8 @4 I+ J; i - BNE .Reset
" {- t" v& }( s3 J' o# A - JSR Music_Play_Pre_10! m+ b2 p" `6 J8 y3 L
- .Reset;重播当前曲目
; ?# T6 L* o5 Y4 l. M6 v, u - LDA FC_Gamepad_Once& P" }6 z9 f4 o' R, w; b7 y
- CMP #JOY_KEY_START
2 [( H, n3 R* {% r" O; Y - BNE .End, b3 B' S# Z* Y# \2 Z1 E \
- LDA FC_Music_Index" z B$ d$ v# d9 ~. q
- JSR Music_Init_Process5 ?0 M& k7 |5 H9 h4 M4 y
- .End+ R7 R. @" f! N c, s9 Z
- RTS2 D& V6 p$ V( \8 I% A, S0 B/ c% S
- ) e2 Y* X8 a9 [" z/ g' @) t
- ;----------------------------------------------------------------------& H `" _7 V; o' S7 r% w2 F
- ;播放上一曲
" m8 V B3 U/ C2 l. i# Q - Music_Play_Pre# ]1 Y" l" o7 e$ T9 ]* M( \
- LDA FC_Music_Index
D+ V" h" T# |0 p8 {# d* w- S - BEQ .End
2 P; F2 r" y# z! F, z: ^$ p9 M - DEC FC_Music_Index
2 P% f8 T' {. L: _ - LDA FC_Music_Index
e! s4 n2 ~1 z9 {9 ?5 x! H' [ - JSR Music_Init_Process0 S0 B& P4 s; A3 m; U
- .End
2 r3 b0 b9 X5 h) U" L2 g7 ?4 v# j. S - RTS
) x# q. m# Y1 v( _9 V - ;----------------------------------------------------------------------: M8 J6 W+ X. q( A$ }
- ;播放下一曲; J0 i' p# e. T* _* c8 `2 J
- Music_Play_Next4 {( V/ C# P) U' g
- LDA FC_Music_Index
" F7 d% [ |9 L" i( _ - CMP FC_Music_Max_Index+ X' q, y* L5 v& v- G1 J
- BCS .End( p% H j1 B( `
- INC FC_Music_Index
, q: b P3 T( w( j: i/ B+ I4 } - LDA FC_Music_Index
6 h5 L+ [# n5 x - JSR Music_Init_Process
" T; J8 x& {6 { - .End0 c' C7 e! D$ k/ W0 g* g x
- RTS
% R: O0 S8 e4 L$ L U - 0 i% Y6 G Q/ X" x& X
- ;----------------------------------------------------------------------5 ?* T8 ?% W( z0 `
- ;播放上10曲
0 ]! \7 i# m1 T- u+ j8 G" ~2 M! T: I - Music_Play_Pre_10
& w3 G/ A+ k/ f& t2 C4 _# \' ` - LDA FC_Music_Index m8 @0 v6 G- Y* ], j- u0 U
- BEQ .End
/ |# V( e# j8 ~3 y; Y( ~ - SEC9 o( N# C9 J [( f3 F
- SBC #108 C) w, O) u& M8 p
- BCS .Pre_10- F! z" p" i' n+ [" v8 k5 W5 G8 a) b
- LDA #$004 R! z1 @, z( I9 `+ w
- .Pre_10: U8 q% j O7 x$ T
- STA FC_Music_Index
# c. C! i8 P1 C. i$ Q: p6 Y - JSR Music_Init_Process
, r. ~5 A" i l( d& s6 Q6 w - .End
# d% T6 o( e2 q - RTS
- h; M/ a* K% a& q9 P - ;----------------------------------------------------------------------
3 r8 Z$ K1 W) n$ _ - ;播放下10曲9 c) {4 l* f* Y" `8 }& {. i8 w
- Music_Play_Next_10
+ S+ {8 V5 j o. g6 D* Y m - LDA FC_Music_Index8 c: N A9 X% v @
- CMP FC_Music_Max_Index: d* {/ t2 y# d5 r0 C$ R; U G) _
- BCS .End+ G+ K- Y- r- h, |( W
- CLC9 _$ z$ ^$ C) l+ m
- ADC #10 `& P( U* R: o$ V
- CMP FC_Music_Max_Index8 Z w+ a+ f6 q# V. g
- BCC .Next_10/ O8 R3 f- K: `& B# z
- LDA FC_Music_Max_Index0 I1 J# E6 ~: @1 H( S) b1 H
- .Next_10/ \8 \ ^, Z5 F+ X
- STA FC_Music_Index0 q. m8 o: Z) l/ q4 B
- JSR Music_Init_Process* ~0 y! l) \& X+ C! g {/ b
- .End
& d9 o& L- q* L! B6 _ - RTS$ I0 ~0 K6 K7 f- A9 ], f( q7 x+ u- t- }
- $ I Y* d* _: V O. `
- ;----------------------------------------------------------------------$ M2 A' l, e; C7 c9 h& \
- ;8位十六进制转3位十进制制7 f) q7 y+ A+ |
- Hex8ToDec: {/ `) W6 f- `* O8 O) J8 Z1 W
- STA FC_Dec_Data_19 U& R6 b# Y# `" b5 `) Q
- LDA #$00
. t: r6 a3 x3 L2 d - STA FC_Dec_Data_1002 m! z1 N* W& c6 Q9 J
- STA FC_Dec_Data_10* k# x( s8 f4 n: X0 C5 p7 Q
- LDA FC_Dec_Data_1
/ Z) B: f1 j. z- g6 a! w' P - .Convert_100
, c/ c; R: i1 R( u/ d - CMP #100
' w) R. z) g: E - BCC .Convert_10& Y C2 ]) D- K
- SEC
6 L" I/ x' n7 s3 I( C1 S7 C% ? - SBC #100
% T( M, y( l( O% W u" ? - INC FC_Dec_Data_100
: r3 x2 C" `, P; i, Q' b, i, B; |; P - BNE .Convert_100
' `7 [ }7 V/ F3 T1 D - .Convert_105 S" A3 {: F) h4 |
- CMP #10# P/ n7 W. P8 d8 \
- BCC .End% t$ R+ m5 o/ o$ D9 Y, O0 ]
- SEC. z( o& v( |3 {7 y% C! O0 R
- SBC #10
, l$ |! U! F+ A; Z6 t: j" X - INC FC_Dec_Data_102 e' ~3 [( A5 q, G) h' i+ l, Y, R4 V
- BNE .Convert_10
4 A9 d6 n2 o# E2 i; C; D - .End- ~3 q& {: J) Q' R+ d+ X( z) I
- STA FC_Dec_Data_1
& g/ J) j& c1 y* H+ R' q2 E8 ` - RTS
0 T# I8 x& U5 |* ` @% B/ _& R - + W5 O% f# P7 ], p( S8 B; d; J$ L, M
- ;----------------------------------------------------------------------
8 v/ R" @3 f, ^ f3 s) Y3 F' G5 a - ;显示曲目信息* V( m0 G" m8 j2 W$ E" f6 q
- Music_Info_Display
/ H7 D3 [3 f7 g - LDX FC_PPU_Buf_Count8 ]3 ~& S8 {- H9 u
- LDA #PPU_WRITE_MODE_CNT_LINE6 V* q( C7 }$ J b' J U
- STA Use_PPU_Buffer,X
7 `# q" W% w8 y1 b3 D+ F - INX
% T; ~+ p0 Y0 l2 e3 n* z -
6 r; M) G- [5 R - LDA #>MUSIC_INFO_POS- k! E/ ^$ U# B& d/ w& n* r
- STA Use_PPU_Buffer,X. @* B% Y" q5 m2 K% v
- INX) P7 D2 ~% |, y# S6 Z' O+ R9 t- M
-
* i5 ^6 `6 f; l& C - ;居中 G+ g% {( p3 r: i+ n& t
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/26 q9 ^2 x! q. K- Q5 c1 \
- STA Use_PPU_Buffer,X: a7 ]* O; b, V* h
- INX
* P$ W' B, @5 E9 C5 P -
1 k2 ?: m# w( K1 ]1 V+ V - LDA #$05
# y5 U1 X$ Y/ }8 N7 [; g: H9 ] - STA Use_PPU_Buffer,X2 Y, C# h+ v% {9 k
- INX2 U3 [, W$ T; A" q. `4 \
-
5 S% n, m9 j/ y6 h D0 m - LDA FC_Music_Index
6 H, e( U, M: c- U/ q! T4 p, V% P - CLC
7 K9 P* ^- Z: R: { - ADC #$01
0 }2 A0 R2 `3 o H4 w8 s" m1 f: m. B - JSR Hex8ToDec
1 P4 q# k, d8 _* E+ k - $ X" T- S4 o, g9 G& f9 H, u
- LDA FC_Dec_Data_10$ ]3 z# d5 R! R' W( }
- CLC
- d( A0 j# t T+ R5 }4 H - ADC #'0'8 m8 H. y- `9 ^1 D/ n
- STA Use_PPU_Buffer,X$ J$ H4 c/ K/ s Y$ B0 w# h+ w
- INX! v5 b/ m- E; L. U; Y. t
- 8 r3 l5 e" h- D$ V0 Q4 ^
- LDA FC_Dec_Data_1
+ F7 O; P' u8 z - CLC% W0 X+ m: E$ A4 s! p! Z, p
- ADC #'0'
9 K7 f Z( Z' j3 b- { - STA Use_PPU_Buffer,X
( X5 G) v7 @: O - INX
9 @" o$ u f5 S- p/ T - ' o$ X) O' [0 [, c6 p" m
- LDA #'/'- B+ b# f+ ~" O& c+ d
- STA Use_PPU_Buffer,X
- d4 ?$ e9 B" {' _ - INX7 D0 v* T( v+ h' l% E- ]
-
" o6 P1 k1 Y9 l8 t7 _# E3 ^ - LDA FC_Music_Max_Index
; b" c( }7 a4 |/ b - CLC
/ ?9 w9 D# D+ q6 M: P' A$ D T3 s - ADC #$01
; W( ~- X K6 k9 p& z - JSR Hex8ToDec, H6 N4 t9 M, a/ r1 d5 o& _( S2 }+ Y
-
8 x( T" w7 m! U. t - LDA FC_Dec_Data_10
$ V- v1 `! z) q1 z& r2 z - CLC
- Y' f( ^$ Y! [: ]% m( O - ADC #'0'8 o' V3 t: ?# D; j, ]: h" E
- STA Use_PPU_Buffer,X4 r) |! n; |! N7 d! m
- INX
3 n" r; _( A& t9 ~) a - 1 x7 q0 l6 Y7 D
- LDA FC_Dec_Data_1
/ j, }* _ B' |4 b; \ - CLC
9 l5 N- u0 `2 V `% ^# [ - ADC #'0'
; }% o+ Y/ Z: w) f - STA Use_PPU_Buffer,X1 g/ k! T3 O" q
- INX
8 D$ o- [# N3 E+ g - $ W9 t" ]5 i& @: b
- .End
$ Q3 W9 y m8 j3 z8 G& Q+ D - STX FC_PPU_Buf_Count
7 g+ o. U& J: B6 @2 N - RTS
' s7 h) j a2 H7 t
2 \ N: R/ ^- Y; z( D1 m( v0 a- ;----------------------------------------------------------------------
7 e6 x4 V0 G" V" x/ t - ;音乐曲目初始化处理
6 e. T# g) e, R; n/ D& h - Music_Init_Process- x2 ]8 B5 S$ n! x8 k/ [
- PHA# \8 f7 h& K4 V3 i) `- V6 A
- JSR Music_Clear_Process9 f+ C. \) K4 U
- LDA #$1F$ u8 m1 d' @0 w: D/ D' Q+ F/ M
- STA $4015- Z% V& y/ n* _$ ]( Y
- PLA
$ p: w$ k% h a3 u - JSR Music_Init_Addr
8 b0 G" z; z. R, E4 n/ C - JSR Music_Info_Display" X5 A, F- G6 F
- RTS
+ E7 r+ E* @) d+ P6 f; R4 K - 9 K6 {7 |+ }7 P' U! [9 k
- ;----------------------------------------------------------------------
' F+ `2 S( |# T$ d$ q5 Q% ^" n - ;音乐播放处理5 l6 z# I2 m0 \. y
- Music_Play_Process1 C% g1 P2 [( ?* ?
- JSR Music_Play_Addr8 l- S# ]* r0 ?3 Q
- RTS, p9 ^. v: n( D2 `( c/ [' [
, s! z, Z9 N7 m/ {- ;----------------------------------------------------------------------
) k( V( m- a9 x0 {2 L" L - ;音乐播放处理
* a& i6 g+ D3 i - Music_Clear_Process$ o) b" A6 D5 N
- .IF Music_Clear_Addr
6 w# |. V* x) q - JSR Music_Clear_Addr# k" ^9 W$ {. {. x: |6 n
- RTS
# h' r \! N. H - .ELSE
( U& q3 T+ ^& p) d( a" c/ i5 J8 G - LDA #$1F
) H# b- |, Q' Q, O - STA $4015( K7 x( a$ {9 d6 D5 h; ?6 B
- LDA #$00
2 t9 T9 o7 n C! J3 v! s0 V5 Z+ C1 i - STA $4010( w1 d* Z' d7 J+ J: ?. k
- LDX #$00
( J3 ~5 ~0 Q) s9 k+ i+ i& v0 W - LDA #$001 L( a" a/ z; f1 D0 j" z
- " E: ?) I. P3 O; m
- .Music_Clear_Zreo_Page_05 q' V+ D: z- c. x# W: @6 c
- STA $00,X6 }6 `$ X4 h5 R
- INX
) b' C4 ]' t: u1 e# Z - CPX #Use_Zero_Page_Begin/ I* t8 Z! |$ v9 d( f3 k: @/ N
- BCC .Music_Clear_Zreo_Page_0! b# V' F# m7 ~% u
- 1 O. Z6 _/ ^2 [, q+ @- C6 q$ i
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size }0 \1 x+ Y) s# i. [+ R6 a
- .Music_Clear_Zreo_Page_1: D9 W% z- \' z \% R
- STA $00,X! a- o+ i" Z, r% `; L6 {
- INX
, H0 ]7 p# p) ?0 Y( R - BNE .Music_Clear_Zreo_Page_1
r0 e2 i% Y% T* e% _; h" {& s - : u- ?( ]6 z* p. T5 g
- Music_Clear_Process_1
. V1 s) ~ i9 f5 @6 p8 l9 V - STA $0600,X) N0 f/ ^0 r) O/ C
- STA $0700,X
8 O4 F2 i, c, @4 u( G! a9 x2 w0 s - INX
+ a/ }. R: m! X' z# |/ n. [3 { - BNE Music_Clear_Process_1* i1 |- C- k* Y/ R) M O& K; m
- LDA #$10
2 }" ~# s* x; U2 G$ i/ q - STA $4000. r l9 q7 z' ? ^" N# s
- STA $4004: |) K E+ }' s3 @
- STA $400C5 ?9 U) O2 G8 s% w
- LDA #$00
" |# z# }( m8 j2 S9 P! r - STA $4008& p7 Z5 ]2 x& [& k6 ~
- LDA #$0F
; r- b0 E, M6 [" s! q C* { - STA $4015, @8 x) B" i0 }6 ]6 o& y5 x2 i
- .ENDIF
1 r! e3 _( O, r5 H3 g - + u, R, i3 M, J) {4 n3 Z! u: M
- RTS7 N, T a1 E u/ p2 o$ |
- 6 Y) ~0 v. b) K5 h+ _; R* d P
- ;======================================================================
$ M% n$ ?3 M# a - ;重启处理. b. k |3 U' c% V' y% W7 j
- Reset_Program
3 |, ]1 a) {6 p% H G+ [" N; B - SEI u( C2 c1 @) P
- CLD
: A. e3 {" X1 z4 `* Y$ ?+ x3 @ - LDA #$002 J" M/ t8 j2 A9 t' z
- STA PPU_CTRL. n, Q! G) I( }9 K& l/ {
- STA PPU_MASK4 p n. k% J4 k) U& z& L4 L$ c
- STA JOY2_FRAME4 r: J ?: `6 H2 Y- }1 d
- STA APU_STATUS" |: z0 o' b7 m9 P8 Q G
- & j+ F8 b7 s. S @8 r! e
- ;等待屏幕准备完毕
/ O* ]5 ?1 @ x r+ o! \ - LDX #$02& q1 ~) u& ?6 t
- .Wait_For_Screen_Ready
+ d" h" A. e: f0 ~ - LDA PPU_STATUS
0 k; X4 k: ^/ ? - BPL .Wait_For_Screen_Ready
+ y; C4 }% S7 Y% g2 L - DEX
$ p: @% x: O7 n) n/ r# S* H/ J - BNE .Wait_For_Screen_Ready
1 z7 I! S R3 [: N2 D - 9 }& I$ B- X+ }5 o- Y+ K e
- ;清空调色板
! H0 E% @4 E7 N0 C9 }* i4 ` - Palette_Clear* ~% n3 e/ \5 _8 \. Z1 i
- LDA #$3F- i+ n, @! d8 K4 e
- STA PPU_ADDRESS- g q- L$ U" G* t( D) [
- LDA #$00
: F7 D4 O# O" L9 v$ ^' Y - STA PPU_ADDRESS
* c# |$ A' p9 w: D" s - LDX #$20
5 c7 D3 S; v! g+ A9 I* u/ M+ F - LDA #$0F
0 Y0 y3 Y! }9 D. W4 D5 W - .Write_Data L4 C. b+ T N/ P
- STA PPU_DATA
3 n T: J6 O5 H4 J8 `4 J5 j& S- t - DEX: [0 u! n5 ^7 F1 k5 x( U0 l
- BNE .Write_Data
! T0 e( A7 j: b5 P4 I3 H9 O - 8 q; S* J/ O3 W7 ^! S* W
- ;清除声音 $4000-4013
% P7 N) }0 ^! r3 m$ q7 v' S0 k - LDY #$14; u' m- p" c2 }) P1 i3 m
- LDX #$00$ _2 A0 {; Q) L* [- v1 G* A/ m. W
- .Sound_Clear& K/ z1 e' ?6 R0 S! ^
- STA $4000,X
) }" ?% V) D. V. b- u+ a" f - INX
7 q6 t; t6 \7 o* u: l) P - DEY
7 J7 i: ^" [, D+ C5 b; i8 [+ Y - BNE .Sound_Clear& U" l5 w( P, |3 c# n, L
- - O3 o5 Z( F* R3 R1 n% L3 b) V7 M
- ;清除 RAM $0000-07FF
" K: \7 N, x$ }+ ~' C4 m2 _0 C - LDA #$00
) P4 ]& z! Q5 {3 } - STA $00
, [: ]1 i! R3 }" ^7 s7 T' v- f - STA $01
9 ~$ Q, d9 s/ f# ?" i! k% M - TAY& O1 t9 q% C+ U5 r; a6 j
- LDX #$08
* { c1 D' m& X* A* ^ - .Memory_Clear
2 [) m/ a. E8 M* g8 y. H - STA [$00],Y
/ B" y7 Q9 c6 l: K0 K" J - INY, \/ M2 u% K, e9 \
- BNE .Memory_Clear. ^ L* ~, [% S6 o0 O0 L
- INC $01
# ~& ~' Q* R5 D - DEX
3 R$ U$ l8 H0 J; r, I: h" x - BNE .Memory_Clear
8 P# }6 m; Z% v. h9 e" Z$ c( b - - h0 k' L$ T0 ^9 E( n
- ;精灵缓冲初始化' W2 U& B* Y/ R* V/ a. W$ _
- LDX #$009 y+ A- D! b8 m( ~
- LDA #$F8
g( Q/ ~8 V: r$ Y7 S+ o - .OAM_Clear* @" n/ C. P; s3 O5 z7 a4 b6 C1 z
- STA OAM_DMA_Buffer,X! c. Z) m- z# }$ C7 \
- INX
) M" W/ C) e' F9 Z - BNE .OAM_Clear
$ r) l# p5 g8 l/ [- U4 M, \9 H1 z -
7 p" c& |3 W7 B1 `2 e0 H - ;栈指针初始化
% k; {7 I; ^9 Z6 {% A2 z - LDX #$FF
/ R. V/ M. e! D* J; X1 C8 d' T - TXS
& t; e m( k5 [# b2 ~ -
/ W/ B* h) q( S3 P1 S& Y - JSR Nametable_Clear;命名表清空
; {8 W1 s/ G' e* L3 u4 b; d - JSR Palette_Init;初始化调色板缓冲
/ F# {; o' Z3 A5 T( Z2 s - JSR Static_Text_Init;初始化静态文本
L& c7 J: P, I# h8 G) _ -
8 V0 x [* f4 M! @ - LDA #MUSIC_ITEM_TOTAL - 1
, k* L2 s# r2 ~* I - STA FC_Music_Max_Index( g/ \' j7 Z# d0 G1 B
-
, F# s. h. `/ `8 m - LDA #$1F
2 y3 L9 D2 ?1 |, Q+ x2 B) y - STA APU_STATUS
% i: W' _' y e) L - LDA #MUSIC_BGM - 1
: \, h& A" k2 I6 t! t/ T - STA FC_Music_Index
+ V [0 U4 g' M2 u: { - JSR Music_Init_Process;音乐播放
/ ^/ D. p% B) B9 z7 c/ ~+ K - - ~' v) [( f: S5 k' q/ x }
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)7 J) O7 ?8 A# x( f+ S) V
- LDA #$1E* V" F- X2 S" t
- STA FC_PPU_Mask_Buf
: a' O; Y w) I; n -
s. g5 q m2 ?( x2 o0 m1 g - ;启用NMI处理. O$ d, X* `7 k' \3 n/ Y
- LDA #$80
6 r) `) `, }- J7 w( b, s2 ] - STA PPU_CTRL
" m3 w8 o O2 A -
7 V$ e. o% h9 @& R+ d - ;程序循环, 剩余工作交给 NMI 中断处理5 l' A4 o& t' E: e/ o
- .Loop* q* b2 r3 y! K1 b2 F0 y7 }1 \
- JMP .Loop4 ^. G% y. t7 F& L2 }* I4 G h9 ]
- 7 p5 u0 O& a: |$ h3 \" F9 O
- ;======================================================================
0 i1 e" D; x4 Q1 I) T* S H. X - ;不可屏蔽中断处理
# D( k( e" [+ g: ~/ R) ~: R - Nmi_Program
' {8 {3 u" o" x - PHA
, c1 \' H# n& C! o - TXA
8 ~) R x0 [/ }* y! T1 y v8 I - PHA
, j1 n0 o+ k7 D( | - TYA: @+ C B* }) D9 b
- PHA
: N8 O: p$ V. K) m5 y -
$ Y) e% n# I7 y7 e( K: t$ f! d6 ?6 P - LDA PPU_STATUS;读取使得 PPU状态寄存器复位% {( @& i9 e7 O
- 8 B1 I) E; D" J3 o
- JSR FC_PPU_Procrss;PPU处理 C, Y; z6 R2 Y
-
) c$ j" g. u9 [6 o - ;精灵内存更新
9 x: y5 B8 { n4 e1 `; | - LDA #$006 p3 b9 s' U* M5 h7 I8 F9 a
- STA PPU_OAM_ADDR
6 s- {, W/ T& \% X2 P - LDA #OAM_DMA_Buffer / $0100
) a+ o# o3 r0 g - STA OAM_DMA
; z" B# v$ s! r8 } -
7 C- W r! @7 ^2 G, ] - JSR FC_Gamepad_Process;手柄输入处理; Z, J @- j+ ~- t
- JSR Music_Select_Process;音乐选曲处理
7 L4 M7 r5 {5 p! x# j2 K - JSR Music_Play_Process;音乐播放处理1 C) \+ X5 q5 Y# g
- 9 ]' J$ v* J# N# f" ^+ C4 t" L
- PLA3 \2 T+ [; J2 g
- TAY3 a2 y) X5 m# C& H
- PLA6 T4 }. w% O+ u9 e4 E# z$ z. U) X
- TAX* _% W. }1 L* j/ b, `6 r; U+ {! c
- PLA
& q/ c+ j8 X; n6 l2 q- ~4 S* C4 Q
+ j2 Z* A; Q4 `$ x7 z9 A* h; x4 _. u- RTI
' H5 J- j$ n5 W6 p( T, r% G
) ` y% f* E8 d- ;======================================================================
* s3 |8 S0 d7 e% { - ;请求中断处理
$ ^7 S& w2 K* O" ] - Irq_Program' I9 V1 M6 B* f3 j2 V# h3 S W
- RTI
2 s: A, b9 w9 b. ` W - , a4 a( i+ O8 y7 f0 T, x
- ;======================================================================- _0 @! J7 v5 S0 U4 g
- ;中断向量表0 @9 X0 B+ F, y) J9 F2 h6 c4 M+ _
- .ORG $FFFA
2 a7 k% \4 k. J - .DW Nmi_Program ;NMI触发时执行
4 _+ r' b6 Q0 F+ d# x - .DW Reset_Program ;载入ROM时最先执行
7 f% `( s- B+ M q) g1 Z$ y" V8 J - .DW Irq_Program ;IRQ触发时执行9 E6 z2 B. Y [) q+ q3 y
复制代码 ! ~% L. L7 B. t- l+ v; w
8 S7 z/ m5 E7 U
9 _/ Y& R- P0 C4 z- g
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|