|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
" S9 x4 C0 w# `8 X6 e
2 l* T7 G# H9 t! i) D* E以下是主框架代码:3 x& }0 t$ H$ }. E M9 L
- ;======================================================================
. {4 R$ ^1 U8 r& Y! Q2 P6 s6 I - ;文件头
- Q" i: b4 a- o j2 w2 Y - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量 U- B$ C' }/ U I
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量1 w7 n0 \( h! m; g
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
' V+ j2 ~, E8 t3 L7 T - ;======================================================================
& @, A y7 H7 ]$ O& E1 v5 y4 z - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2# S- V4 q2 U/ x" V
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 19 y. V0 v+ z8 h% W6 o
- ;======================================================================
7 G9 D2 Q7 w# I4 i" W - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
% J2 G& v/ F8 K - RESET_ADDR = $E000 ;主程序起始地址3 G2 q7 q! U, N
- ;======================================================================
& ]+ `: e1 Z3 }3 O" ] - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
- h) z! J5 w, ?" ? - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB1 c& Y+ y% c! }" Z
- .INESMAP 4 ;Mapper号 (0-4095)$ P/ ^; r" b4 u1 F
- .INESSUBMAP 0 ;子Mapper号 (0-15)/ }$ E5 L9 W+ F: q% |0 Y
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
1 g+ S8 _* M; B3 ?5 Y% ] - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在): [ g( y7 Y a7 B5 m
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)' v4 x' h' g2 ~ D+ @) o
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)
% d, D! q% t3 n( ^ - .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
8 o- ^: k/ y5 N* e# | - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)9 q Y; A) G+ j. ?2 Y
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)$ M( S: e. p, T( d2 ~+ O
- ;======================================================================$ z: L( O) G {
- .INCLUDE "fc_demo_config.asm" ;全局配置7 N2 a: H: I9 T7 H" x
- .INCLUDE "fc_demo_constant.asm" ;NES常量# U; a% e9 D; `
- ;======================================================================- W8 R0 R# ~' u! O
- ;音乐配置9 T! Q- A# I8 a `6 o0 s, n
- .IF 0 = MUSIC_THEME * F! S( [8 O& D$ O
- .INCLUDE "data/music/Gremlin 2/config.asm"
; N: @) E7 K# _7 V0 l - .ENDIF
( u) [7 q! g! K9 A% V* h - 1 U8 r# M7 T* K) p+ T, y* U
- .IF 1 = MUSIC_THEME* o- @8 D" ?/ | x1 H2 r
- .INCLUDE "data/music/Raf World/config.asm"
5 H" A/ t. R5 F2 ? - .ENDIF' H( R; I0 b5 B5 h. x
- * H: w9 Y; p- y, a
- .IF 2 = MUSIC_THEME , |# }0 Q6 w- a- x! N& C A
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"! l; g- P6 }1 [5 p1 W! a7 A4 E) T
- .ENDIF
5 [4 X* U; g3 ?9 Y5 a4 U - & S! c& K5 Y, W/ i! f
- ;======================================================================
) o9 K5 N* q* U% Q2 ?; w - ;引用CHR图像数据
! Q/ t1 s, J( A% N - .BANK NES_16KB_PRG_SIZE * 2
$ N z) U5 Q' T$ }* l3 L1 }+ ` - .ORG $0000
( x1 q9 r e) ], H - .INCBIN "data/bkg.chr"
. Q+ b% ~. w& l7 A5 | - .INCBIN "data/sp.chr"
. F: N) B7 _) E" c0 l -
/ g0 |8 J, G! U2 I6 t' j$ l \" ] - ;======================================================================7 t- y/ N% I( a, V- F
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
# S$ ^7 ~& ?6 D5 {, \) f - .ORG RESET_ADDR" ?4 `* Z0 U& E7 p
- ;======================================================================- \; k7 [$ E, }. S n+ ]
- ;引用其他源文件
' e% x: r& g9 l$ t( n - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
% x% B5 Y; |+ T. V. V+ { - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
/ P! J, Q- D! T; ~/ \ - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理5 Q J) r7 M5 l9 Z
- ;======================================================================
; A' s) \" ]: U6 u
F8 f# T5 l; Z- g( U- ;======================================================================& v& t" W. L3 G5 |- v$ l/ W
- ;等待VBlank到来
" O& d9 A# ?* a - Wait_For_VBlank/ j3 g: Q1 V0 i/ _
- LDA PPU_STATUS0 o0 t/ d+ W, J5 g9 b
- BPL Wait_For_VBlank: i: l1 ]+ f) z& U) g7 Q! p
- RTS S8 S5 |" J/ P5 g$ K
- {4 k' n' `# O; v( \9 F- ;======================================================================
/ g8 y+ L7 g) ]% m5 e( C. n - ;调色板初始化
; ~0 U7 p( l" n6 [ - Palette_Init: k! @9 j3 {" ~
- LDA #$3F
# C0 @9 q+ }' C p) h7 H/ P - STA PPU_ADDRESS
6 O i( O$ ?3 ~1 l+ N - LDA #$00
! M+ b% b: X7 @ - STA PPU_ADDRESS# N2 x. B W. q ^) {7 h l
- LDX #$00# z% Y4 ~: l; V- D/ w. W
- LDY #$209 \9 T, f4 l% ]& Y# O8 h2 l! r1 V
- .Write_Data S# \( G% y6 K% v/ E
- LDA Palette_Data,X
- ?7 E/ y, C, d - STA FC_PPU_Pal_Addr,X; \* T7 S, `* M) i
- INX
" r0 t" p% ~& }5 \, p7 S1 J - DEY' Y& Q. m) q% a
- BNE .Write_Data
+ t: [ t1 I8 f$ o6 x& |: H5 a% S; z - .End+ T* x0 u, I2 R8 z0 A1 {* v! W% w
- RTS
, w6 {3 L: Q3 a6 C9 t# m
: e" c f K( {6 P) O9 V! I h- ;----------------------------------------: P3 {: x" O, j( J0 K
- ;调色板数据
+ E2 }; w% Q5 _9 b' v2 y7 E - Palette_Data5 u9 j: l6 O; H
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B4 G5 L, Z, l% p2 j) `/ s
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
+ o, S9 v, g3 L2 y' o6 b& m" A3 G# O* O - + G# k* y' L" R2 D$ D, y
- ;======================================================================
! b( Z. k8 b# J) r9 u - ;命名表清空 j+ I1 l; v1 _+ [) y
- Nametable_Clear
8 _# n: Q' v) k% H5 A& e - LDA #$201 _# ~6 H, f) i1 e- g( c, \
- STA PPU_ADDRESS
" \/ E7 m! b# R# U( u: Z. t - LDA #$00
% {% |, f% O: {( P, { - STA PPU_ADDRESS
1 v5 {- H5 y: W. R, h' o w - LDA #$00' w% R: ^. S' [ s5 ^
- LDX #$00' {2 G4 C9 r( I2 B3 P9 b8 r" r
- LDY #$08
- e; G4 a. T2 |$ ~, g2 V9 {+ e - .Write_Data
) H0 h& c+ r' Q i1 T0 [, R3 } - STA PPU_DATA3 U2 C- C0 d1 t3 H+ D9 i4 Z8 l
- INX5 U0 a1 V* ^7 S% @7 g2 ^( g
- BNE .Write_Data
) H% Z# T& j7 Q9 z% U. \4 q - DEY
: e0 U& |0 N) [* p5 o( w - BNE .Write_Data
5 H: P H1 Y& J3 A - .End! o6 M& L* |& c+ n/ k Q
- RTS& x% w% e. N7 q' H; u1 k. G0 h6 z( q
- , q4 t4 }" k/ J- S4 h5 @, c& l4 c/ F
- ;======================================================================; u7 U# X9 ^+ ?& ^ A, B' A" I
- ;音乐曲目切换
7 o6 l j9 h. B, Q; m8 b+ [ - Music_Select_Process
2 F8 A3 O! f; a" i' E - / U7 C7 D. g+ v2 O1 C6 |2 M
- .Pre_Music;上一曲9 N0 y; @" \/ x6 I
- LDA FC_Gamepad_Once
n. k/ K6 X6 N - CMP #JOY_KEY_LEFT$ v5 K6 N; F" j9 _- t# ^2 G3 K7 N, r
- BNE .Next_Music7 L( S! f6 r8 a7 ?
- JSR Music_Play_Pre
8 b y6 B, P- H" m6 R3 [ - .Next_Music;下一曲
4 J9 o5 D7 n; Y - LDA FC_Gamepad_Once( I. M$ K: C3 ^
- CMP #JOY_KEY_RIGHT
0 r' ]" ^+ f$ K6 U8 T - BNE .Next_10_Music+ \8 I$ V: ?3 w! r6 _0 b- ?
- JSR Music_Play_Next* [, `! L$ l, d8 ^
- .Next_10_Music;上10曲
- r7 z/ S8 d4 ~3 R1 x1 p, l - LDA FC_Gamepad_Once
5 \9 F4 `: ?- D5 E" j: u. g! K - CMP #JOY_KEY_UP
M0 p5 n! [% } @1 B& Q$ q - BNE .Pre_10_Music
d2 O# O; ?: N9 e* L' }/ n - JSR Music_Play_Next_102 h. D, i& C# @+ q5 u
- .Pre_10_Music;下10曲4 T" i6 B, Z9 z0 Z4 D
- LDA FC_Gamepad_Once* b8 q/ Y6 J- C+ [6 a
- CMP #JOY_KEY_DOWN7 E( y+ }/ P4 C5 p- ^: u& _. `( m/ H
- BNE .Reset& w# h' n5 D7 C
- JSR Music_Play_Pre_10
6 S$ ~5 |1 U$ N, ]! } - .Reset;重播当前曲目
3 B4 g9 ]: X; Z1 P) }2 @* o - LDA FC_Gamepad_Once
# w# a3 ]" g$ ~+ c& P; H1 r+ d - CMP #JOY_KEY_START
5 h/ ~$ \7 u9 K - BNE .End
& v' P7 m! C* ?' x( q' _ - LDA FC_Music_Index9 N; \8 g4 s( D, m( @5 c# A ?
- JSR Music_Init_Process8 ~% z0 H5 F5 W. a" H) a( Z
- .End
/ T5 N$ H7 f- L2 L' [9 T - RTS0 y8 }, c' ?* Y# Z
! ^$ t/ O" `8 |2 X/ X- ;----------------------------------------------------------------------, F# d7 \1 F; N9 Y2 }$ o8 o! i
- ;播放上一曲
" V+ v9 b* d0 F' O( T - Music_Play_Pre
: d9 i$ i; s9 e- O - LDA FC_Music_Index. f7 h$ y8 R0 w& D/ }
- BEQ .End9 \; K1 r( g7 [
- DEC FC_Music_Index
1 g( @! [0 D7 v+ q/ x) P+ ^1 J- k - LDA FC_Music_Index9 S* w. M$ X' z X$ J, D# B/ w
- JSR Music_Init_Process! d2 |0 `* |/ I' p0 @
- .End6 E$ O* _ g4 g6 m4 W
- RTS [8 N" K4 `! T7 b* a5 U o
- ;----------------------------------------------------------------------% L9 z6 C, N( d
- ;播放下一曲
4 }& U: B; r% ` - Music_Play_Next: Z) w! {4 N( ~6 O1 ]# @6 R
- LDA FC_Music_Index
; l+ k/ v# Y8 W; u* r/ C- o - CMP FC_Music_Max_Index0 U0 b1 [+ q: m( @! F0 k. v/ u2 }
- BCS .End0 {1 V! |3 y6 G
- INC FC_Music_Index
( A+ g' b% K. ? - LDA FC_Music_Index
! @0 R3 L, K; [ - JSR Music_Init_Process6 F5 f, R& M e8 T/ y+ Q! m
- .End+ E7 @+ v) q. e7 W5 O/ ]3 |+ r
- RTS. M5 Z8 X+ T$ H& w+ u
% I l3 t* O. b! U( Q" ?- ;----------------------------------------------------------------------% q. m) T* @- E) m! N: z
- ;播放上10曲
0 i$ J. _' M' {! |$ x - Music_Play_Pre_10, \7 ^* b$ D8 q" q) }2 A. F
- LDA FC_Music_Index
9 Y4 z6 x/ U1 h: |, E. g; ` - BEQ .End
+ G% J' H v& b4 K9 ^6 K, Y5 n - SEC
7 v L. ?1 `# ^: p$ F' ]$ S - SBC #108 ~6 ]$ g; w0 x% ~& o# }
- BCS .Pre_10+ S1 M6 Y/ x, i* P+ [% `$ T D
- LDA #$002 Y, [ G1 l/ l& e! P
- .Pre_10
Y. ^, ~1 c6 M# ^* t% {; M; ] - STA FC_Music_Index. N+ Z$ Z, O+ Z' {8 R7 N
- JSR Music_Init_Process: y1 z- I3 g5 o! m
- .End
+ e# r7 a1 L) Z9 V) ^' c7 R9 y - RTS/ S8 T0 q- l) _9 o! T* s
- ;----------------------------------------------------------------------
$ d* G& s/ g- Q0 o$ {) b - ;播放下10曲8 l1 e5 y- y8 Q8 k4 h
- Music_Play_Next_10
8 ^- f# c. t- O2 e - LDA FC_Music_Index
0 x) [: B/ B7 c1 N - CMP FC_Music_Max_Index
& p: G- `8 j! C6 v- x- x - BCS .End) {: k8 J/ A; l2 \6 @/ ^7 x
- CLC
# t! \" F6 u" Z7 J - ADC #10' J% X7 ~. D# D y
- CMP FC_Music_Max_Index
) t; s, X8 d3 J: p- U% o - BCC .Next_10
4 D5 u1 Y6 R" G, l - LDA FC_Music_Max_Index
2 m. p; v& U$ u$ |- T! q& a - .Next_10
8 R' [+ H( a9 ^ v& Q - STA FC_Music_Index
- S* L. G) N- v G8 _ - JSR Music_Init_Process" f, z# P! o" |' f) a
- .End0 Q( H: u5 f9 y3 Y
- RTS
. L% q/ S' O( l7 X! q - 7 ~( f1 i/ M- `# [1 U6 V0 E
- ;----------------------------------------------------------------------
) x* w7 L$ O# |4 }' |0 p - ;8位十六进制转3位十进制制
: W( T8 s; H& t) }! B - Hex8ToDec- l" Y7 V& p" e G: f& d, x8 \
- STA FC_Dec_Data_1
% b; j; A0 j3 O1 O - LDA #$00
, ]2 @* B# B; ~) u/ S( Z2 i - STA FC_Dec_Data_100" q3 H+ m' F! i2 w
- STA FC_Dec_Data_10% X2 u! k$ d4 @" r" _/ P( t
- LDA FC_Dec_Data_1
4 f r5 w( @0 B1 n - .Convert_100
1 j5 e ?( M9 H' B5 c - CMP #100
( X; F9 Q$ S! V$ z) g6 a2 f: B - BCC .Convert_10$ D; D: y9 w' j& v' N
- SEC& z- _* t; Z0 a, a( [
- SBC #1006 c/ t T# _ K6 ]
- INC FC_Dec_Data_100% g ^; X p. Z3 a7 J
- BNE .Convert_1009 Q2 g/ r- T( ^ E
- .Convert_10
/ b7 `! I! f3 B1 I) N! M - CMP #10. u0 } ]1 B; h& V
- BCC .End) f( u( t1 I# Q. f i, B
- SEC
. v0 i9 e( e; S a) Y - SBC #10, U! z$ \0 [8 ^/ j: s
- INC FC_Dec_Data_10 j M1 F2 _1 I% S( c
- BNE .Convert_10) m) }- z/ v& G/ H! ~" g/ W+ Y
- .End" U9 H8 ]1 m/ _8 m" |0 S9 C
- STA FC_Dec_Data_1
* W3 ^; h4 N" p4 _ - RTS- F# B! v u/ [$ m/ t. N* o
- : F! n. k% V5 a/ y0 q' y
- ;----------------------------------------------------------------------
) u* y# x. x# U+ l+ \; p5 l: J$ d d% l - ;显示曲目信息
: m. u$ b4 y+ M, m7 _ - Music_Info_Display
2 U4 J" H$ Q* Q( d7 u) G - LDX FC_PPU_Buf_Count
2 [" u$ e* _0 R- r$ U! d - LDA #PPU_WRITE_MODE_CNT_LINE3 F0 b5 ?) k* f! A" p3 C* M ^! M: z
- STA Use_PPU_Buffer,X
$ H+ L4 l, M* J6 Z/ T - INX
. [( B% o, ^! B8 m* C/ b/ b+ d% w -
7 P% E' m8 Y: @4 J/ D - LDA #>MUSIC_INFO_POS- A4 ^2 u# p/ _8 F& G
- STA Use_PPU_Buffer,X# L$ E( Z8 b( I& q' {6 K
- INX Q9 _5 s4 Q( K7 w; ]9 S' [
-
5 J/ h: B9 r U: ? b: B - ;居中8 M) \8 u: A0 i) x$ `* S* ]
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
3 S' `) Q1 b. _! R% [5 C - STA Use_PPU_Buffer,X; i( `$ ]6 B: ^/ K
- INX# Q7 t* R# e& ~! x2 \3 X
-
" N' {; _$ n( @ - LDA #$05
. ` S! r( q( A+ g3 [1 { - STA Use_PPU_Buffer,X" K t4 ?8 r6 u& |# F- c
- INX
( t1 ^( i- g' J# m! }! z" n -
$ F3 v3 c! v5 I, C' Z - LDA FC_Music_Index' R" i2 b/ W" V
- CLC+ `9 `) \9 S' C2 l- I
- ADC #$01
/ k% L9 `; g, a- U - JSR Hex8ToDec
7 @: _# V% o# S2 W" P - % |' K1 T* a& @0 Y
- LDA FC_Dec_Data_10/ `& h" X9 D) ?% g) R- R. Q
- CLC
& Q, L) b& v E% w6 W8 c6 c* S3 g - ADC #'0'
7 P% d, N. N2 Y0 P/ R' V4 N - STA Use_PPU_Buffer,X
3 N, V1 M" n4 }$ u - INX
+ W7 L4 `, g s* O( Y1 }+ @ -
% W L9 K( P) a& _ - LDA FC_Dec_Data_1$ k! U( W" C; i
- CLC5 F: v+ J1 L& B1 X
- ADC #'0'8 ~& E$ `) F% Z; a
- STA Use_PPU_Buffer,X- C3 v4 I: X3 W4 u/ D
- INX. I4 d5 J$ ~6 w, v$ ^
-
1 g0 B1 O" M, C7 Q0 }- x - LDA #'/'
& ~: s$ M2 k* u1 ^$ n; U& j - STA Use_PPU_Buffer,X
& h2 `" Q% K( B2 P ]/ Z' {$ P - INX
+ ^* u5 c: e4 R2 z -
9 q; }; x- Y. Y+ Q! \$ z7 u' \ - LDA FC_Music_Max_Index
0 `* c, |9 s! H; s$ x* l - CLC8 o$ N7 W, C. u% S* n
- ADC #$01
; q5 n! K6 ]; K1 v - JSR Hex8ToDec
/ f( W9 L/ s! W4 h! s. t -
8 I" R7 v" R+ n7 E- K1 o3 F" m - LDA FC_Dec_Data_102 ?4 r6 q9 I; V O
- CLC
5 w. o$ ^7 z9 k2 _8 L% N1 F - ADC #'0'5 q- s7 l D8 w- m' T. m
- STA Use_PPU_Buffer,X
6 G" G6 ]& ?0 z8 c- m, L2 M - INX! U% D. x4 F- J( U/ F; v0 N
- & Y. |0 v0 o$ y v2 r% p
- LDA FC_Dec_Data_1
8 K& L6 {1 m1 b/ X* F+ { - CLC
$ V7 B" H* ~: T# z1 M$ b, A0 A4 Y - ADC #'0'- r$ s) o/ g7 W8 N; R
- STA Use_PPU_Buffer,X, K" T" ]/ S1 o
- INX
3 \* E, A6 C/ C -
- S4 d$ Z$ `: i' n! s$ ` - .End* Q0 v: A6 p% ?# g6 A
- STX FC_PPU_Buf_Count$ ]6 k' x3 B0 j* D
- RTS9 n' r+ P u( `1 Q& G
! P* S3 ~/ X% Q s- ;----------------------------------------------------------------------! @) @' l1 a1 ^' H2 u4 O: s
- ;音乐曲目初始化处理% l( e0 w+ `- h% g4 ]/ E* `) u9 a
- Music_Init_Process8 }: V8 ^6 c( h# s' I% n9 G
- PHA/ ?3 I- }& v) y8 N/ E( f, K
- JSR Music_Clear_Process( v6 K* k( r9 s4 C8 s7 k0 H
- LDA #$1F
0 V2 f. p0 m; ] p6 i( k; I - STA $4015
8 }" ^' z5 U! p6 ^/ x - PLA* v( `% b I4 {
- JSR Music_Init_Addr9 t7 N: y3 A4 |2 L( T! E2 Q/ m
- JSR Music_Info_Display6 F4 v+ N& m7 X5 x" @; ?+ Z
- RTS
; L, R( C' B; f: a' p& c - 7 T" s' i% }/ [1 Q
- ;----------------------------------------------------------------------
. H) i6 G4 S0 y- B - ;音乐播放处理& N& L0 Z6 p; o3 |2 r. a/ P/ ~1 F
- Music_Play_Process
& c* L T! h4 k% j- q/ c3 c) h6 X7 ?( i - JSR Music_Play_Addr
: v0 t$ R( R! j' b Z m - RTS
4 X. U, B3 h$ ]' Y% j4 R) d2 k - " A/ M+ b9 M8 a; G- [
- ;----------------------------------------------------------------------, y) {* b4 l2 k+ _- A
- ;音乐播放处理9 F7 r/ z' M2 t- e( g3 Z. b! X
- Music_Clear_Process" J3 h/ O5 c% C
- .IF Music_Clear_Addr
6 s; Y e# e2 D - JSR Music_Clear_Addr
; c% v) P$ X) `+ M8 m* A7 L5 O - RTS
. D& Z5 Y' r6 h5 o - .ELSE
2 B$ J, u! }4 q3 \3 F i0 X; f - LDA #$1F4 T: T9 m6 G; h) ?7 Q
- STA $40151 G+ d! m: U, a8 B& J" o* {
- LDA #$00
1 \' B* x& [3 M# p$ A: b" c9 x - STA $4010- ]4 F- o% L9 H; u% f
- LDX #$00
6 R! S% \* t$ f5 a* c$ M4 U) a2 `; v - LDA #$00
; Z0 F+ k, U. }3 p: p' x0 q5 R- ` -
% I5 M( H+ ]# x& V/ E - .Music_Clear_Zreo_Page_0
8 k% Z% E# v/ n! L - STA $00,X2 }+ t, L* l$ e4 c, j% l
- INX* H# o2 E3 V# }; t; x# _( T
- CPX #Use_Zero_Page_Begin
3 C$ X2 o8 Q3 [/ [2 k - BCC .Music_Clear_Zreo_Page_0 h6 ~; N* e3 z |. ^
- 4 O/ G. w+ y s$ N8 `6 U$ D- ]5 t
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size
1 M6 v, L( x; l4 P - .Music_Clear_Zreo_Page_1
2 @0 F) k$ ? {6 E0 N ] - STA $00,X
+ w! j: T L0 C- g0 \( ~. t - INX
' q0 _( E7 h: }2 p3 k% g5 I+ T5 Q ` - BNE .Music_Clear_Zreo_Page_1
$ J) H" b: y4 \; t9 ? - $ h- Y X! E0 R, }# O! }
- Music_Clear_Process_1
2 j4 d% g- G; Q& |6 H$ P1 n - STA $0600,X4 u# n( B7 W4 y. m) H
- STA $0700,X
( k/ J; N0 B' s# u/ ?( m) G, g - INX0 {) q" g0 k4 z8 ?1 y& j
- BNE Music_Clear_Process_1
' U$ I/ s% }- b - LDA #$103 \3 [: z& ]* n( S- H2 B
- STA $4000
3 [/ Q7 K9 U4 x' G( f - STA $4004. {* h6 s! i5 \- K9 t0 A" l0 D
- STA $400C0 b( Z/ O1 j3 f, l+ o
- LDA #$00) u' q( s L) y
- STA $40081 K, D5 {! ^9 K* W K
- LDA #$0F
{% _7 k: ~9 P6 g) @( [ - STA $4015 H9 G. z' P- T$ u% o
- .ENDIF
9 o; i; Q8 o- U6 {" C -
6 J) Q+ J! V, ~1 j( N - RTS
8 C8 b: }' H# `. l) @ - 0 @4 _2 p9 k( I" _1 d0 v% Y
- ;======================================================================2 N' {& n6 D$ v, Z C. ]1 G" `% N" J
- ;重启处理/ E, o. n3 c; G% _* F q
- Reset_Program3 D0 Q% `2 ^" q. G& L) p4 V3 [
- SEI
2 g# ^! W$ g+ i - CLD2 F5 i0 U% W! @* P) M
- LDA #$00
$ t% C# B* o5 t- Q. \1 l3 @+ }/ X - STA PPU_CTRL
2 ?) W( U x, M1 \ - STA PPU_MASK7 B3 }( N' O d1 d3 U8 A
- STA JOY2_FRAME: Q3 l) w: |' x7 I: F" r
- STA APU_STATUS; v `# |, H* l8 u3 F
- . p3 o( ^7 B1 o8 T7 P# A$ U
- ;等待屏幕准备完毕6 T0 w$ l; u& e# R* j3 T
- LDX #$02
5 D) L0 q& U$ W - .Wait_For_Screen_Ready" m& F$ n3 P* L( E& ^
- LDA PPU_STATUS
; m6 w; `' Q+ y' |0 g - BPL .Wait_For_Screen_Ready6 j( n W1 w) d
- DEX9 i6 Q/ z: V/ r8 u7 f
- BNE .Wait_For_Screen_Ready4 U2 g' g- B( B/ t6 \
- / V! P6 ~! N: T: j
- ;清空调色板
7 X2 D6 v% n4 n! |- b - Palette_Clear
) j4 d+ x+ ?# h' `4 [9 ~ - LDA #$3F
7 g3 y4 L; j7 D$ o* T, K$ G' R - STA PPU_ADDRESS
j) x1 B. L1 _0 P5 ?3 \7 y8 n+ O3 m - LDA #$005 _1 T$ p: s y7 B
- STA PPU_ADDRESS2 ~& S" f# h; O9 V$ ]6 `+ p# i
- LDX #$20; U& O, H1 L: d' X0 |
- LDA #$0F, C! X! o8 Q8 v; y( Q6 s% W( ^. w
- .Write_Data
4 `- L9 G& D: I - STA PPU_DATA
; b5 h: M. N: G' ?% z: V+ P - DEX
: x# V' c- [/ o9 V* c6 F. H1 e - BNE .Write_Data
. C- e8 W& X* t9 m
: ]% |5 \% i1 n" a# B! n! X8 v- ;清除声音 $4000-4013
# F; ^3 g( K& z: o t: ~' w1 I" ^* L# @* o - LDY #$143 R( u* y; b0 s! f
- LDX #$002 g( _" {4 a% [
- .Sound_Clear- K, X' T, d; g% W' x9 [$ `
- STA $4000,X
. o& _; D% V! I- d - INX
' g5 B/ d: N1 \5 q) E2 r - DEY# b# ~1 { ~' k; y, f& T- y
- BNE .Sound_Clear2 {3 _% k( ?/ E
-
* i0 M7 i% c# Z" l4 W - ;清除 RAM $0000-07FF5 \) S, O% S. n5 r
- LDA #$00
4 B& Z" {. F8 ^- P: Q1 e - STA $00
7 X Y3 G# U& u - STA $01
) a Z$ b$ v i1 Y - TAY
6 a7 c* d9 t& i - LDX #$08
; ?, R2 |1 f+ |2 a+ y - .Memory_Clear
7 N* ~. z5 L" z, _* W7 H - STA [$00],Y+ c4 a6 [4 g( ?2 s, z. `
- INY
3 a( l( P! q! v( w* {: A3 d2 k5 L1 E - BNE .Memory_Clear
. D; w/ f) }; H% O/ F3 `2 Z - INC $015 O J7 R. @$ A( N( c* q9 `, t6 |
- DEX8 ?7 r1 Z8 s/ K3 Z- Q
- BNE .Memory_Clear4 i1 x7 n# ~. a) j
- . h2 e2 P: v& C( R1 y
- ;精灵缓冲初始化
, u+ o G/ f- [4 w7 g - LDX #$00
5 ~/ `2 W O m* N" r" k2 h - LDA #$F8
* R7 I7 z7 g" a( m* T - .OAM_Clear
2 c' l) w5 j: n- S+ h6 w! w - STA OAM_DMA_Buffer,X
& [/ r: q- F% o' A0 ]6 d2 R/ ~: Y( ~ - INX
1 s# S. h8 `8 u! Q) F - BNE .OAM_Clear+ B3 P$ B/ ~6 b
-
! n* \3 K4 v; a' ]1 U - ;栈指针初始化
2 u* H8 h- B; b3 l1 V2 l" t - LDX #$FF6 [) o _5 ?6 D' \
- TXS, B5 Q$ P6 i# x W& Q( n
-
& ]9 H# S6 o) |' v: ]8 r ?( y - JSR Nametable_Clear;命名表清空
; b, V _" M" c+ T8 r$ Y, p6 S - JSR Palette_Init;初始化调色板缓冲8 z7 ?* }) {0 n
- JSR Static_Text_Init;初始化静态文本
( f K9 I1 c: z" F5 W -
- L1 \2 N, l2 b! Q - LDA #MUSIC_ITEM_TOTAL - 1! i4 Z9 u! k" w+ G3 {4 x5 B5 Y
- STA FC_Music_Max_Index0 I* ]" X* G+ Y) m9 E e8 e9 a
- 6 M% \8 a2 A9 ^# |; D- b( p
- LDA #$1F
" H" ^0 U0 }- ] - STA APU_STATUS
' S0 j: I8 t: s0 [( ?( V$ Z& ~' E4 j - LDA #MUSIC_BGM - 1
1 A" ?% S$ c, `7 }# ~ - STA FC_Music_Index
. F$ k0 ^0 x# z; o% c2 V - JSR Music_Init_Process;音乐播放; h$ s x$ }+ F+ C, J
- ; F" S; i7 t0 I+ p4 v
- ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态): C8 T% w: b/ W: m, ?! Z
- LDA #$1E
! n# l* ?, H V9 i& \ - STA FC_PPU_Mask_Buf0 @. Y e X3 d j1 G
- F! o5 N, ^$ z* q. I
- ;启用NMI处理
2 ^+ }) q. U/ B" D - LDA #$80
% h! Y# D, L% ]# C' _9 [ - STA PPU_CTRL: X {' y* i7 z5 C
-
' ^' R) W3 \6 |0 J - ;程序循环, 剩余工作交给 NMI 中断处理5 n v5 p# E, k1 I4 D+ _
- .Loop# j5 e: L6 z8 Z0 ~5 H- x" @
- JMP .Loop
5 @3 o+ K) h" r' |) ] }% m
9 r% J' c2 K* a Q& R; `- ;======================================================================3 S! N* k' n2 D0 Y; v4 @2 `8 Z
- ;不可屏蔽中断处理
# M/ L7 f* p0 A# Z M& v - Nmi_Program
+ n% A0 W: t0 A0 N - PHA
' _) K( c( Z- T" O0 h0 m - TXA
+ X7 r; p4 C( }6 o2 w" O5 Z - PHA
: M9 x1 T& L& M - TYA
% O, ?) ]2 [6 y' V: n6 T2 @+ ~ - PHA" y( L, ]/ t8 ]; ^& g a
-
* b- m. }8 N' w8 n! s! a" P - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
( C# G$ |5 D& v+ z - : k) q, a6 k& M9 l6 X' z3 q: b
- JSR FC_PPU_Procrss;PPU处理
, a: W' h% P2 P' M. k, F -
- W" A2 Y) A, ~% y% [! o! r - ;精灵内存更新
, N& b8 G; _' x. ^& p - LDA #$003 }, e& u8 ?' P( l3 z) s
- STA PPU_OAM_ADDR
% Q2 ~6 |, E8 j$ P, v/ | - LDA #OAM_DMA_Buffer / $0100
+ D J$ A# u* U+ m: m - STA OAM_DMA
$ q# ~0 O# Q4 F0 l - 2 g7 J7 i+ y6 T# o4 U
- JSR FC_Gamepad_Process;手柄输入处理( R, @; r4 @" Q- [. |- F
- JSR Music_Select_Process;音乐选曲处理9 l$ |$ V+ i. t1 O- ?+ @8 p9 u
- JSR Music_Play_Process;音乐播放处理
3 n N2 G% L$ k5 _' E( ^ - 3 B) {7 m$ V5 V+ @6 \! n
- PLA
4 @3 g' w8 l5 O/ L1 q! K - TAY$ e+ _3 o. t* C4 @7 H- {' i8 v: Y7 B1 a
- PLA5 k' v0 `# y/ q: t5 t
- TAX% K# h5 h" F5 Z8 K/ V2 i L
- PLA7 l+ o! o, T5 j. Z
- / t1 @2 ]7 u6 E3 @* \ F# e
- RTI
/ ?! K H7 W3 j/ s5 t# j - ; c n6 R+ |/ t' f: ]) c
- ;======================================================================
- U0 k' }9 g! g' ~1 i - ;请求中断处理
) Y% o- f" N7 p$ S, ? - Irq_Program
% y1 Y6 P% ?! J8 |$ l* n r. l - RTI
6 O5 J0 l' _0 r8 p/ p# J; r( A; c
# D2 o s- `1 D) T* D2 y" U- ;======================================================================
. R7 ~* b( w, N9 G8 L- s - ;中断向量表
- C# m7 f( [+ t* v; x+ V N2 j; [ - .ORG $FFFA; ?+ H8 Z5 I; Q, h; g
- .DW Nmi_Program ;NMI触发时执行
@6 r9 w- z9 l7 Y2 y* n$ G - .DW Reset_Program ;载入ROM时最先执行$ r0 U+ W; B H! I9 v
- .DW Irq_Program ;IRQ触发时执行
$ M6 ~# y/ N, I7 D
复制代码
( p( w: u$ d. t1 L
0 R& U! A. ]5 ~9 ~" }! i0 E. ^# l( ~3 S+ j. D
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|