|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下- F2 i( m0 Y, Q* s. I
. p3 a g* c4 W
以下是主框架代码:2 @1 o% F- q: V
- ;======================================================================( C$ O$ p' V6 E1 ^
- ;文件头
, |$ x8 O3 E0 C) v$ I4 m - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
% ? a- q& K E6 t$ v9 b: M% V - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量7 y8 B7 j$ X2 Y [2 m* [1 V# W5 t
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码( q" I: _# @$ |" I% B( U; q
- ;======================================================================
7 | b1 N, ?- u9 w. Y1 I% ?1 y8 j - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 21 A1 V- o% T: d7 v
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 18 ^. h4 ] J6 G
- ;======================================================================
+ I U+ a4 k+ z. D - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
! X2 G# m+ Y8 t2 E2 J - RESET_ADDR = $E000 ;主程序起始地址, u" E; G: R* `" M) a& v q& S
- ;======================================================================
: m1 C0 _9 U$ ?2 C0 F* T0 p - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB/ J$ m# Q8 o" r% {. T2 L2 O
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB3 t( G+ @' ~( f
- .INESMAP 4 ;Mapper号 (0-4095)- W- n( s% B7 L M3 z
- .INESSUBMAP 0 ;子Mapper号 (0-15)
7 a& y! v' `! j - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
" V* h7 P& `$ c8 v% _- h& U - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
& G( J" y% V' d5 i - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)" }6 A+ f$ Y! z7 T9 }. L! i& F
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
6 Y9 @4 U" r; G0 f1 U# r - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)8 b$ ^( R+ _1 k
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)
3 G) d: ^. Y4 I' \3 M& Q- f+ O - .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
; Z& q3 S" X9 o6 e8 K - ;======================================================================+ u; d' m( X s/ p$ \ r
- .INCLUDE "fc_demo_config.asm" ;全局配置) e8 ~% I3 C7 v; D2 _
- .INCLUDE "fc_demo_constant.asm" ;NES常量5 d8 `4 H5 I8 G, p( ]9 E
- ;======================================================================* M. t" x2 g5 h$ E2 p3 i7 w. A
- ;音乐配置
9 E4 q- Y8 N5 b, Q; B/ N - .IF 0 = MUSIC_THEME ; S" C* I5 E- F6 [% s
- .INCLUDE "data/music/Gremlin 2/config.asm": l1 y d6 {4 w
- .ENDIF2 n; } X4 k- v2 z
- 1 j) W2 ^/ R3 v; ^
- .IF 1 = MUSIC_THEME
6 K% _) K: W4 D4 V" [: L& J6 Y - .INCLUDE "data/music/Raf World/config.asm"6 u; E& }0 ^% ^
- .ENDIF* n" J- q( u: L. Y
-
/ }6 U" G/ o9 t - .IF 2 = MUSIC_THEME ; V/ e E# v/ F( i+ a
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
& z* w/ A) G5 }! f - .ENDIF
/ [4 a2 c+ L \ k0 e1 @' `; ]
. _# X% W. r0 h3 n% v- ;======================================================================
* d5 c" j9 }- m$ ~ Q$ }0 M - ;引用CHR图像数据8 T3 }8 `! I7 b; S( }1 K8 R. i8 G$ v
- .BANK NES_16KB_PRG_SIZE * 2
* K$ w1 | N x7 a. T - .ORG $0000! o' r* j$ X4 E# \, f8 ^
- .INCBIN "data/bkg.chr"
( s, [+ o( @) K" m4 W' A/ h% `( N: f. G - .INCBIN "data/sp.chr"5 y) x: @: A r
- 0 U4 J6 o- z6 g6 J2 l
- ;======================================================================" _( J [* I8 o5 s' R/ E
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank7 q9 G& i7 Y) T! K# E9 Z' q8 Q
- .ORG RESET_ADDR/ m) \/ C3 t3 _
- ;======================================================================
. ]2 c8 t* ]! k4 D$ L - ;引用其他源文件( B9 z: j# z1 `3 G! ~( U+ ~5 ]
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理: _! y& a9 Y) @0 I
- .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
" q2 M# `+ ^# }, h - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
" p% C5 Q( z4 N0 d. c - ;======================================================================0 C7 K. c8 W3 c& a+ g# L6 c7 i
8 U* K- ]% n) L+ B" \4 a9 h- ;======================================================================
' z! M# X0 o$ Z" { - ;等待VBlank到来1 s. l4 c4 I8 s7 P; i+ G. `& r- t
- Wait_For_VBlank
. o3 L$ @1 y! Z" o' f$ s - LDA PPU_STATUS M K" U" i$ A2 U' a8 @
- BPL Wait_For_VBlank
) F$ \# g% F# }+ T5 B' `0 _- u - RTS: x7 x% }1 K9 T" Y* Z% d
/ ?+ S3 I4 r1 m# R e! p- ;======================================================================
7 v5 ^! r" e! w. I - ;调色板初始化0 s4 H* W6 E% [3 i& R7 ]
- Palette_Init+ p* \* b0 V' {! X% `8 M
- LDA #$3F
3 W8 A5 _6 T! ~% ^, q8 S( I - STA PPU_ADDRESS
8 A8 y- J4 b2 j7 _4 S - LDA #$008 E5 I+ P9 L* W2 R2 S
- STA PPU_ADDRESS0 J( q( _9 m5 U0 @8 }- _
- LDX #$00) V) o" {, S9 g0 e2 B, L* ?* P
- LDY #$20
6 f% `8 y3 @* Z+ e - .Write_Data! `; W5 k% F3 T& x6 B
- LDA Palette_Data,X
7 W; G5 J" f0 {8 F+ t - STA FC_PPU_Pal_Addr,X$ v# E7 v9 ]5 Z* {' e9 C8 w
- INX/ \! M4 k/ ]; M, L$ v# h
- DEY1 ]4 j. D# d+ }$ x! ?. ]& ?/ ]5 i
- BNE .Write_Data
7 E, i/ z4 j# r& U; x - .End2 C) \, q3 _; Y, c( Q7 o
- RTS% z1 h( e% O) V, W
- 4 O1 ~0 k! i8 z4 y/ j
- ;----------------------------------------
& |& C. i) z" L# L' P" i - ;调色板数据6 F, S6 n! N- |
- Palette_Data0 n, q& P) O# @8 m5 m! g
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
) n) U+ `7 L1 _ - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 221 c+ s+ L7 N5 r* S& x6 k
- ; v6 F# J, W% E: O3 g
- ;======================================================================; u* J' K* ]* i; P4 x: _6 i: Y7 A
- ;命名表清空
6 `" |; C- U; Q# j - Nametable_Clear w9 S7 d- F) V" m' o$ O) J" \
- LDA #$20
7 ^' e. O0 r+ k( Z/ z - STA PPU_ADDRESS, o' o- e( D( Q" ~; h4 [
- LDA #$00/ ]9 D) @% r9 `: y
- STA PPU_ADDRESS4 H- X& m! m3 J$ X
- LDA #$000 k8 i z O j' e# {
- LDX #$00
! b2 q6 g; }- V - LDY #$08% p( H6 X4 J/ K# m/ ~) [& x/ ]
- .Write_Data
$ w$ x4 K. w2 @# j4 P B3 Y - STA PPU_DATA
0 G0 W4 j. V6 t$ r9 q - INX
4 h2 A6 R) e4 f" W - BNE .Write_Data
7 O$ x0 o1 N0 O' F8 A8 k - DEY
3 @, c6 `; H4 c2 S - BNE .Write_Data6 Y) @0 `: M: s2 X& Q. R, D
- .End
/ q+ l& {4 p: H* \) q - RTS
, @8 ^4 i# m+ S9 g
3 V s+ {+ e) W; o& ?4 X0 P: ^- ;======================================================================
0 o# B5 E; h1 A" O: u. P3 p$ x - ;音乐曲目切换
5 T2 t8 s( \$ ]2 {7 p$ j+ { - Music_Select_Process
% E. i1 S, n$ M) N: T# |3 q5 n: h
3 h! |9 T; g. Y, K5 Q" ~; J6 \' L5 k! b- .Pre_Music;上一曲$ L2 T) I1 T0 R1 n( B7 v! H+ J4 P
- LDA FC_Gamepad_Once) A% P$ ^7 n, r+ X( e, f
- CMP #JOY_KEY_LEFT
% i }. U8 {6 J3 G3 M4 m - BNE .Next_Music
! w$ U @3 I7 h) X7 W+ c3 ] - JSR Music_Play_Pre
- K, {& Z# ^% s' h - .Next_Music;下一曲
5 E. ?; Z9 O0 G' [6 k - LDA FC_Gamepad_Once
0 L: X% j( R+ Q1 h. h* i - CMP #JOY_KEY_RIGHT$ `0 V# ~' ^6 e
- BNE .Next_10_Music
9 j) z! y5 @! o9 t - JSR Music_Play_Next
: D1 K2 r3 G, H3 v" | T$ R5 o - .Next_10_Music;上10曲
0 ^5 N: J% }; ~+ k# {* s* e - LDA FC_Gamepad_Once0 ^4 ?: q4 M$ S4 D
- CMP #JOY_KEY_UP
) m4 G% V3 L1 d6 B: n - BNE .Pre_10_Music
: I" p5 j3 K+ t! c - JSR Music_Play_Next_10
* }8 r$ X2 D6 I1 I- B4 m7 q- Y# _ - .Pre_10_Music;下10曲* G# X4 P- I1 T' @# N
- LDA FC_Gamepad_Once' S. K& r5 \! c* D. f) Z. v. n- A
- CMP #JOY_KEY_DOWN Y% _# G* u6 E: n' `; K% m1 X
- BNE .Reset
; a' W# P! v( M* W* N - JSR Music_Play_Pre_104 y8 B, j0 [! ~3 b T
- .Reset;重播当前曲目
, W" v1 B0 p. X2 d - LDA FC_Gamepad_Once
( J8 y& }6 D8 t" `9 `) K! o/ ^ - CMP #JOY_KEY_START
; L) Q- |8 v5 g4 w( B* g) } - BNE .End
( V, |: n! T& Q) H9 h1 a0 u0 B - LDA FC_Music_Index
6 l$ j+ v: J4 ~: X$ [5 }3 j - JSR Music_Init_Process
. Z5 S) X7 l9 w% E - .End
3 {; B# b$ o7 f- { - RTS
2 ]& ^" N1 d- p9 j! U5 p9 R
1 s; V+ w# f. e5 U2 f- ;----------------------------------------------------------------------
* U& W ~ E# L/ z! X! ]( D+ A - ;播放上一曲
/ \# ?% t- g( R - Music_Play_Pre: a g( [. i4 K! [! p
- LDA FC_Music_Index
& R1 ~$ F5 q! F) b) N2 @# B/ I - BEQ .End3 |7 D a: b* n7 |# d
- DEC FC_Music_Index
" l0 r, F! a. Z x- K* ^; O& k - LDA FC_Music_Index& v) ^. Q6 _- k( d Y9 [; t
- JSR Music_Init_Process
, w1 \9 Y; p2 @# @, x - .End
9 n. ~+ X9 T0 b0 O3 J - RTS4 P) J' j6 w9 z2 z1 ?- u% J, l# F
- ;----------------------------------------------------------------------( l& i( `/ Q" ]+ g& \
- ;播放下一曲. W7 G `# x$ y) m9 K4 \
- Music_Play_Next
6 C) O6 k* ^& S I - LDA FC_Music_Index
. N8 _# D) M+ `+ O3 d& _! P" q - CMP FC_Music_Max_Index. a! N& `. y- K9 n2 Q6 w
- BCS .End
z& H! X% ~/ @* g, R; s - INC FC_Music_Index& ]" d+ ~! a1 F0 X
- LDA FC_Music_Index
~+ R' I5 S+ i$ E* b" ^( n - JSR Music_Init_Process
6 b* p1 ~% [. r - .End$ o# {& g3 L' x* y* _) I, r+ t
- RTS
+ o( f3 l% o$ ] - 5 Y$ W* _, P- e/ f
- ;----------------------------------------------------------------------; m3 Q# \9 ]) ~1 a( y
- ;播放上10曲1 f" \/ h' @3 C* t# L+ s
- Music_Play_Pre_106 I; s* T4 T2 k4 j
- LDA FC_Music_Index" T, Y9 p1 J% q# ^2 x7 l! L1 M
- BEQ .End
; r: k2 ]& e% M0 T1 t9 S# l - SEC
0 l+ H+ \0 H0 v( O2 W - SBC #10$ c7 X0 X6 E3 b2 E- g; N; R2 g
- BCS .Pre_103 s4 a) g3 X7 O; Z/ X/ x
- LDA #$002 a1 H: f. J: P# I! N
- .Pre_103 T2 n+ R+ j4 F/ C+ G
- STA FC_Music_Index4 ]$ O8 j' Y9 k( m V/ {+ y' O
- JSR Music_Init_Process# A, R% d2 G7 u: ~8 ^- @- w
- .End6 r& N% _& e0 ? O
- RTS
2 b! W4 Z& m& `5 n) A - ;----------------------------------------------------------------------" k$ p! o8 H) F$ C* v" u+ |: F; x
- ;播放下10曲
$ q% m2 v7 p+ ]" N5 q+ m0 I - Music_Play_Next_10" j$ n3 J# s6 h/ N3 a2 X
- LDA FC_Music_Index
8 E1 K' W$ s1 D8 b, T& M% H - CMP FC_Music_Max_Index
3 Q2 B! }7 s$ B' | - BCS .End w; A {( l9 t) }
- CLC
5 Z6 u1 p% G' W - ADC #10- d; u! a t/ V- j5 H" B
- CMP FC_Music_Max_Index! k5 {; \4 i7 P
- BCC .Next_10
0 K6 M% m% J+ o" L: ?# f' N( w - LDA FC_Music_Max_Index
: O' B) x& m g - .Next_10
' ~2 z- G2 g& {; f+ D" X) L - STA FC_Music_Index
k9 A1 k, e! O- c+ x i* ~% E - JSR Music_Init_Process
) D4 l+ ]+ o0 |! Z7 G; b* j - .End
8 m* j i! g7 ^, v. z. E - RTS
}& ^; e2 ]8 g" M$ Y: F! W, ` - ! d: F: m& L6 z& i
- ;----------------------------------------------------------------------" y" h7 [2 C' p, Y4 i6 u
- ;8位十六进制转3位十进制制0 _# s- g/ o, A8 S* F/ }
- Hex8ToDec
3 I2 C1 l+ m6 o$ `9 M4 ~/ M# c% b - STA FC_Dec_Data_1$ u# d C* y( U( e! k9 H9 b" ~
- LDA #$00+ A' O* G: d! t, l4 ? J
- STA FC_Dec_Data_100& h, ]& C! @+ w- [* n0 Z$ o
- STA FC_Dec_Data_10
( v# T* N" d1 h4 H - LDA FC_Dec_Data_1
2 k9 m, P4 J' b6 [ - .Convert_100) b4 m% b F& h V& @
- CMP #100
( i r8 V3 ~- S. X - BCC .Convert_10
" a1 m6 m( u- H/ b/ Q - SEC
4 _% U8 P' ]& Z9 E' K% f0 q - SBC #100; i% G% F) D# o$ @7 V
- INC FC_Dec_Data_1008 Z* o, o/ ]) C
- BNE .Convert_100& |& {' i/ x7 a$ {7 s
- .Convert_10/ @ L% v9 I, v" f
- CMP #10) b% \) ~/ } x/ o
- BCC .End
2 `: g0 Q. w) j2 I) m: K5 Z - SEC
9 f. Q# V$ p5 c$ } - SBC #10 S% @ ]0 j5 l7 `& w+ {
- INC FC_Dec_Data_10; P& G- N8 q2 `6 H, b% A( ~ f
- BNE .Convert_10
, u$ @1 L8 f; Q1 C2 k3 i n4 y$ h4 H/ f - .End# k; a+ H% D# H: z1 J5 \: k
- STA FC_Dec_Data_13 X& d- T! s' y4 `
- RTS
7 g7 u( |9 e. O" s
% o5 m O, \4 T$ l" k- ;----------------------------------------------------------------------: D) _. w. D, Y; O. ~% S7 p7 B; s
- ;显示曲目信息5 h6 w* E6 r$ r; {) K# H4 v f, P2 _; v' R
- Music_Info_Display
5 t; K* U* ]5 p5 U- H - LDX FC_PPU_Buf_Count
/ L3 c' y6 \6 R0 s4 h; _ - LDA #PPU_WRITE_MODE_CNT_LINE- e' G* y+ Q# k" u
- STA Use_PPU_Buffer,X
; S% r* l" S% [ - INX L" V5 |, r8 @0 F- T
-
" |; e7 k$ O& Z - LDA #>MUSIC_INFO_POS
1 I2 W# i0 H% P9 G- L: u - STA Use_PPU_Buffer,X
( D! ]$ R) N* v/ o1 q - INX% W* p7 t/ Z# M" ]7 \& k
- 4 z, C2 Q6 S1 F/ F4 J
- ;居中5 q$ R: }; f5 C3 G m' G
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
7 a4 ]4 L4 Y# n5 s* U/ S- S - STA Use_PPU_Buffer,X3 s! G l7 h0 O1 ~# S
- INX
% D0 U7 p/ ?7 j" I$ \ - 9 `8 a" v Q/ x/ l
- LDA #$057 K' x0 ~+ X2 c7 }( ]0 D
- STA Use_PPU_Buffer,X
o, o* d+ I7 ~/ _* @ - INX
# D0 k0 ^9 p- V -
; B7 T& C* Z: ], ] - LDA FC_Music_Index
% M* E6 f) u+ u9 @ } - CLC& d ] ~4 k, j$ I$ j/ w' s
- ADC #$01
2 I s* f1 n! X7 O, I3 n - JSR Hex8ToDec* P4 S/ i; s0 j7 ? f( p
-
0 L$ { s7 {5 U+ p1 v - LDA FC_Dec_Data_10. w0 z2 V% ]. G7 ?
- CLC% R9 w/ p9 M6 A8 _: p4 \# ? ~' k
- ADC #'0'
: @' w& j/ @' b- N! M# t" V& C - STA Use_PPU_Buffer,X
7 F4 ]4 b# A6 p' E/ X - INX3 _4 ]& R- V g( a. w! h
- * V F5 X6 Q' z7 i+ j" n; y
- LDA FC_Dec_Data_11 t1 h, {4 L- {7 p" i
- CLC
# A5 |7 [7 V+ n1 F - ADC #'0'+ R: R% W+ p) B% e- ^/ c1 j" r1 S
- STA Use_PPU_Buffer,X
. ]# I7 w" _5 ^! V# N% g - INX \$ A. Q6 T8 U' V r/ _# G/ F# n
-
- @: ~4 D7 F" m0 T( B - LDA #'/'
2 E- j; N: b" u( H - STA Use_PPU_Buffer,X
/ l2 ?" ]# D% m3 I - INX; m$ ^% z" G. w4 {5 ~6 u- Y! o7 j
- 8 G3 N& o6 Q+ f1 K, F
- LDA FC_Music_Max_Index& ?3 R# I" _1 c- J) z/ c
- CLC# a( m9 A8 w" L2 H m6 v$ i" y/ z
- ADC #$01! _" l. R1 k @
- JSR Hex8ToDec8 p* H$ v: @% f e2 K, b
-
+ q! D( ^+ M+ h7 g% \ - LDA FC_Dec_Data_10
. R. H3 A7 i) u, h% C5 _: A; w - CLC
/ k+ q* Y; u/ `% O. D - ADC #'0'
& p) p9 o6 E$ ` - STA Use_PPU_Buffer,X
+ q0 }# d5 D4 N6 l9 j - INX1 y+ v1 `3 c2 @# {
-
! K1 Q. o& V0 _4 Z! u8 F - LDA FC_Dec_Data_1
+ o1 w! K( x+ g - CLC! o2 m E0 d5 w2 Z/ D
- ADC #'0'
# }# S5 o: V+ F% g7 g - STA Use_PPU_Buffer,X
$ j9 a" m: Y4 K( K2 c, R9 m - INX
- c# ]* N' O$ Z' M- } - 6 q; h- ?: e( q0 N3 r r
- .End: u) f& n& Q5 b. }# t5 z
- STX FC_PPU_Buf_Count
7 x, B+ Z7 G8 a5 Z4 } - RTS: P7 E; [7 |2 O+ Z
. g" ^: {, a5 K2 k3 P. @- ;----------------------------------------------------------------------7 G0 S( l# \: _0 P, D3 @
- ;音乐曲目初始化处理
# e1 ^8 o1 P5 X7 F1 K - Music_Init_Process9 A- a3 s$ @/ J1 j/ }# y
- PHA! @, M" j) g4 M( A8 m; C
- JSR Music_Clear_Process9 _- n: x! F/ ]8 g3 \* f: w0 f$ Z# x. Q
- LDA #$1F9 D) W. p: Y# W' ~2 Q1 z Q# U
- STA $4015/ F/ J) J& g2 D5 X4 U( J% u
- PLA9 z7 t7 x4 l" j9 J' I
- JSR Music_Init_Addr
! S/ r z1 u4 N: M" N* ~( u6 |& a$ a9 p - JSR Music_Info_Display
) w5 r; z6 x3 |% Z - RTS
/ ]1 W8 K% H. M9 ?' S7 R7 y9 S
% l% V! @ I( O7 J# l. ?- ;----------------------------------------------------------------------$ P j' R5 L& @* Z, j) C: `
- ;音乐播放处理
0 t0 C' m( F/ o1 A* I5 G - Music_Play_Process
0 Y' @7 L' Z) @, c- ^ - JSR Music_Play_Addr
* m) V1 }# _) d' C - RTS; X; c3 a% E0 L
- 2 {/ Y2 @6 v9 S$ I, t
- ;----------------------------------------------------------------------2 @3 [0 h% o' l' }1 n# f+ u- ~* T) {
- ;音乐播放处理& z5 X% T3 ]% J' a7 C+ E Y
- Music_Clear_Process% d% d' r, i4 ~/ s
- .IF Music_Clear_Addr
2 K' a! n9 ~, K8 p$ y: k - JSR Music_Clear_Addr
@3 m& P: z4 B& }. l - RTS
& ~7 f0 z/ V& J - .ELSE; A9 x S/ i' Y& Z
- LDA #$1F( s) Y5 y* o( W6 j- k0 }# n4 R
- STA $40159 Z5 |4 |) [0 u3 L3 V
- LDA #$00/ G- \0 y" P% d
- STA $40108 K+ F& u. {. c7 k$ q7 h
- LDX #$00
) e. {, d" g/ m9 T9 r5 W2 s* K - LDA #$00
) k# t! ^3 x2 s. M; B - 6 ~- c/ m4 t# H3 X; q, w9 S+ l+ O' _
- .Music_Clear_Zreo_Page_0
0 J2 w+ ]# r6 `8 E* n8 d) | - STA $00,X
- ]# V3 P/ }, ^ - INX3 t7 G" p+ N4 I9 F
- CPX #Use_Zero_Page_Begin' {. q7 x& k4 C
- BCC .Music_Clear_Zreo_Page_0
6 ^/ |3 r/ k' b- `& y4 n, i i -
- F& H4 B- U4 L; j: d" B/ F - LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size/ G$ G6 \& d7 J1 v' L0 ?
- .Music_Clear_Zreo_Page_1
* q9 ~( u9 W. g: u1 Q4 D - STA $00,X
) ? K ]9 g5 m* G - INX a* h, x; G; w! w# r
- BNE .Music_Clear_Zreo_Page_19 L' ^2 V* T: [0 N( ~
-
7 l1 G% j4 |, y3 {1 d0 w' D - Music_Clear_Process_1
. C4 a9 O. v! L - STA $0600,X' L9 Z. m8 z: h; ~
- STA $0700,X
6 ^3 k2 v0 H" o& h. f, ] - INX
0 R& s. m0 M" @. i - BNE Music_Clear_Process_1) T( l+ \$ o! n: }1 m! n+ E* F2 B
- LDA #$10
* l" u' Y3 G! j( u - STA $4000
4 t) ~. b& B$ P3 B - STA $40049 `) S) `/ j! ^6 ?+ n* [% w
- STA $400C7 z# T# [6 M# m! p3 {9 x
- LDA #$00
+ v& y1 z6 I/ r1 z - STA $4008
1 _& q# E, a- i$ r8 d, \" ~ - LDA #$0F! q- N4 W7 X3 n& t* l$ z9 Z
- STA $4015/ I/ t" G- T1 \$ s
- .ENDIF7 O7 C- S: y0 U3 u& z, |- U& c
-
, B% {' T8 v% l: \ K4 @# r$ w T - RTS; @; D( ?* B7 G) R
# r/ s# c+ t4 c& P& g- ;======================================================================( Q5 H% {9 ^3 c, S7 g
- ;重启处理$ r3 {* {5 G8 ]) W7 D: l5 ]
- Reset_Program; k' T) E1 J9 c
- SEI$ o* u9 A! Y6 h- d; H
- CLD% Q" `8 v& i! E ?! G; A# i3 v
- LDA #$00
$ k o7 A) c1 j" o& r' t/ b1 `. e - STA PPU_CTRL
& d. |+ R1 v( Y" x" x* J - STA PPU_MASK
2 C' J& A: @" i; a. ~5 n/ L% d/ D - STA JOY2_FRAME/ Y+ Y( a* w9 U) T
- STA APU_STATUS; f0 ]8 \* S P; p% C" L* x( u
- , `1 {9 U @ ~8 D- f, E7 G$ R
- ;等待屏幕准备完毕
" Y5 v$ [. p7 g' Z- \ - LDX #$02" n; ~7 [5 Z5 n9 p1 L( k; k$ _% h5 m
- .Wait_For_Screen_Ready
4 k* V. x) ~# l/ }. q* p* k- o - LDA PPU_STATUS( X R$ u; y, N: ~# S
- BPL .Wait_For_Screen_Ready
: E1 q: n5 |" _& y3 v - DEX6 [ O6 N" h: e- M& K
- BNE .Wait_For_Screen_Ready- w/ w3 |9 {. e
- 1 T2 N( d4 i# l5 B0 u) p. Q. b; T6 B
- ;清空调色板
# V) _: h1 g) [4 Y4 x6 J - Palette_Clear
/ p9 }3 o2 ]2 S" r) h4 i - LDA #$3F
2 I, W7 f3 v, w$ A' D - STA PPU_ADDRESS+ k9 W9 b7 V8 U/ r
- LDA #$00
5 |# q+ \2 \* p U# y - STA PPU_ADDRESS
$ u. i5 z; ?$ H3 C, u& N$ w - LDX #$20
) x" {& }5 ?+ a: a3 f. _ - LDA #$0F
7 x+ E! T6 N. M0 B$ I& S6 Q - .Write_Data3 t' R8 n4 \# J# p
- STA PPU_DATA
K3 u+ r% e8 p/ H3 ^4 ? v$ f7 s- J4 g3 H - DEX, m: ^& w( d, e/ `+ D& k z# n
- BNE .Write_Data& Z; N# C9 L, g0 L* V+ s
0 s, P# X8 {1 @5 Y- ;清除声音 $4000-40134 ~9 J/ L! q d0 f3 F
- LDY #$14# |! y0 [3 E% Y/ n( |
- LDX #$00/ q% [& y) Q# ~5 N. `) h B
- .Sound_Clear/ g, l$ N) j/ [- E" i
- STA $4000,X
( T# C! [" ^+ y+ ?3 I) T/ L( u9 f - INX
# q* D9 b: @' ~: _ - DEY
( p+ R2 g c q5 e - BNE .Sound_Clear
L) I# q- A% X' y' v -
, q5 w; T4 t( s& ?) ]% K! O8 J - ;清除 RAM $0000-07FF
/ J$ m* d# ^; u3 d. z - LDA #$00
. @9 [: Z8 m* Y4 _5 h0 K2 K - STA $00
g! @# X f" I, l5 i7 x/ W9 | - STA $01- j, [/ p' y9 N( J9 r) _
- TAY7 k5 X3 i6 Q8 s3 V1 f4 j; C3 ]8 `
- LDX #$08
* l6 b8 I/ c% g# \: \2 d - .Memory_Clear6 N" v* K. Q. ?, `% _% l
- STA [$00],Y$ |- `0 b& l6 ]4 r" P) i. t( b$ [
- INY: b& S/ o% N" |6 T
- BNE .Memory_Clear
3 r8 P, E" k5 k* q+ Z1 i6 F - INC $01; {) c' Z2 i3 {( H2 _. c' ]
- DEX- ^# _8 [* h9 p. P
- BNE .Memory_Clear
) L- O( C4 H' q/ g, A* D$ d2 H3 ?3 Y - & ^3 v# O/ K! z& p7 i/ l
- ;精灵缓冲初始化
, }8 Z; r f, H8 `2 U, r - LDX #$00
4 N* h8 }- a6 }% [' J/ V5 Y4 @ - LDA #$F83 _& a4 @" z7 [" I% P
- .OAM_Clear
: i/ Y& i5 P. b! G - STA OAM_DMA_Buffer,X7 [. G- t- t! W V5 L
- INX
7 |; ~+ Z* ~9 ?7 l8 }6 S - BNE .OAM_Clear" t2 |$ R( G- o. ]& e3 m) D
-
; f, F6 }: p% O' m/ S1 Y - ;栈指针初始化
- o" E& y. u3 W% ` - LDX #$FF
+ S5 Z8 `# F9 w9 h - TXS
- G. w; e* A+ D! R% S; V4 | -
/ V8 P; a4 w! U/ f5 g - JSR Nametable_Clear;命名表清空
' Y l* m! |+ d$ G; q! Y - JSR Palette_Init;初始化调色板缓冲! e3 z8 a; _5 W, ~$ Q# V
- JSR Static_Text_Init;初始化静态文本
1 k- l0 h; y$ ~$ f" w) s; W - ; o1 N' S& y1 Z: g
- LDA #MUSIC_ITEM_TOTAL - 1
! A5 R' ]& T/ A - STA FC_Music_Max_Index- ^9 |7 v# ]$ J1 q% S
- ( A C- H3 S# S8 o' P& g& q
- LDA #$1F
) k, p) w' W) v - STA APU_STATUS
2 N; n( O8 h7 f @! V4 j% H* E% n+ f - LDA #MUSIC_BGM - 11 ~5 J- P% Y- J2 K5 k# E6 \
- STA FC_Music_Index6 K y5 r6 I* _4 O! F
- JSR Music_Init_Process;音乐播放
9 i8 U8 j) W* Y/ h8 A -
( c t) p! j) J: w5 d) | - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
* C2 M0 A1 A/ V; z - LDA #$1E) e. ?' ]) r7 `' r+ [1 o1 ?: j. F8 K
- STA FC_PPU_Mask_Buf
1 r1 D3 J8 n+ `1 D7 O6 d! u. Z K* Q -
" G# y' m+ p0 d { - ;启用NMI处理
' u* e8 I) d/ c, e' O( I/ E - LDA #$80
7 W3 |/ E' {6 Z- s0 ?9 G5 e - STA PPU_CTRL
# f6 V0 O8 N$ v. W8 W5 s2 | - 3 [6 c( s6 R' O% R4 Z
- ;程序循环, 剩余工作交给 NMI 中断处理4 O$ t1 E- c2 r$ F9 h' t" i, X
- .Loop. x: a/ D, P) m: p2 k$ o
- JMP .Loop ?5 q9 k8 }+ P
- J2 r: L9 F4 J: U# q" M [& R
- ;======================================================================
, z: X$ U) Y; c* H - ;不可屏蔽中断处理
+ m( d1 A- o& o/ \* ` - Nmi_Program
: O+ f/ x( h. \* @( S* C - PHA# r' k% }6 t v x Y
- TXA
4 b3 W; O& k/ l# u - PHA
5 U5 N7 I w1 T - TYA `" f0 y! w. r8 G
- PHA3 x2 h9 O* T+ n# A0 H7 [5 w$ X
-
! {5 w& \4 u6 J4 G - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
9 q3 d, I ]. c* k - ' G/ _0 j8 F: T- \ |
- JSR FC_PPU_Procrss;PPU处理
9 x. l7 m, j5 O5 ]% _ - 0 N6 ]/ [/ d/ H/ g1 o' k
- ;精灵内存更新
8 u( W$ l1 R$ ? - LDA #$00! t& w, P. r& D: I5 v7 ]
- STA PPU_OAM_ADDR
# A7 T" [7 [* k% C - LDA #OAM_DMA_Buffer / $0100 e @* v1 _3 s
- STA OAM_DMA4 k. L% j* x7 M: Y
- + @ \: D$ }. o a) p
- JSR FC_Gamepad_Process;手柄输入处理
& }3 R: ?# @& n( A; u, @9 k - JSR Music_Select_Process;音乐选曲处理4 b' W1 b5 w2 p, t% s0 Y/ b
- JSR Music_Play_Process;音乐播放处理
/ k7 a2 b* y q( [, f+ ^0 ? -
. C6 Z5 g8 J3 A - PLA
' C' n' f" ]* E3 y9 Y - TAY
& k7 c7 _( k# S7 s; K, X& h - PLA/ y! b, {9 U0 O
- TAX' \6 v6 r( \0 {
- PLA
4 m/ x5 D7 J( P! K4 n6 E
5 D1 {$ x3 \5 C" Y6 ~! k' N, B% i- RTI" D( G# ~, \8 T. H# R2 s
! Z4 j A/ q! `; T) u6 [- ;======================================================================) F9 H, L Q+ Y5 L4 Q' r, g* a
- ;请求中断处理+ p* _ W2 ~" U' |# P5 Y
- Irq_Program2 ^. w% j$ _% C, I- \3 `1 t
- RTI: o7 n& Q9 h$ J: a* z$ _
- C9 L8 y8 U- s5 e' @- n. Z/ Y
- ;======================================================================) {+ V, V! M7 Y) J/ O+ L
- ;中断向量表
9 k2 ?& J: V& c) I1 u5 w& M' u - .ORG $FFFA
( C" |$ Y9 w4 F3 q- [6 n5 N - .DW Nmi_Program ;NMI触发时执行8 l( Y: }2 ~, ^7 M) |. P
- .DW Reset_Program ;载入ROM时最先执行
! L/ ^. f* k$ ~. h - .DW Irq_Program ;IRQ触发时执行* q, c; X1 H" T4 ]
复制代码
( b$ Z4 C) g& W7 u8 F1 \
! L0 g5 I6 ]9 b4 k/ I, @) g' R7 N* v8 @. @( s8 P+ \8 F
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|