|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
$ F1 O/ w3 C+ a: \4 `6 {
. R; p# B4 O0 i0 _+ \: O9 E! Q以下是主框架代码:
2 E7 K, K6 N5 L$ y- S7 \& Y: X5 c- ;======================================================================
$ | I, o/ A' i - ;文件头- m. U! F, q( c2 Y5 t$ `
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
& ] r0 l, B7 ]8 {7 x - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量
9 @$ F0 X( U( o z5 N* i# Y8 p - BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码
5 C( M* a- _' _ {) A7 C - ;======================================================================
( i3 n9 m3 Q& ]6 {& U' ~) X3 A8 K - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2# l. @% W% q. k$ i& x: p1 w3 K
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
6 U* @$ h1 o$ Z6 Z) u! B* M - ;======================================================================! e8 h% j; K: S+ B; L7 s
- RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1" }* p6 u# D9 N v. U
- RESET_ADDR = $E000 ;主程序起始地址
' p; T' @% Q# y - ;======================================================================. `0 H8 a' H8 X" K1 _% V" A3 _
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB6 f6 [0 a ~" n8 _6 m0 P
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
: q7 x0 ~; J: ^% R - .INESMAP 4 ;Mapper号 (0-4095)
: p3 w/ p3 n9 Q n - .INESSUBMAP 0 ;子Mapper号 (0-15)
! U6 \, Q, Z8 ^: d6 E4 e - .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)+ Y5 r4 O) R, g, ]
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)) @! Y% K6 i( ~* Q, X \
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数): k$ i% C: e' V" ~+ S5 h6 _
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)& x+ m3 u. d( k' P+ Z# o7 v2 ^
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)
4 u x' U& O% _9 b - .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数); K1 j0 f$ t: S6 G/ a+ D
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)2 R/ V& Q+ K% N6 Y
- ;======================================================================
& n) a( V( A8 |* c8 W& s$ V0 R - .INCLUDE "fc_demo_config.asm" ;全局配置0 V3 P& |0 V2 |: U+ B% J
- .INCLUDE "fc_demo_constant.asm" ;NES常量
5 r. m" \: r8 A - ;======================================================================: E# _% d1 A6 \& @! [2 M6 f
- ;音乐配置
& f% z& R( `6 e% H" V+ o - .IF 0 = MUSIC_THEME
% K4 p9 x7 p* n' P" w5 u0 F - .INCLUDE "data/music/Gremlin 2/config.asm"
! k+ y* x- s) q4 E - .ENDIF
8 c0 h+ a- @4 ~ -
3 w8 c9 m4 N3 s. b- N - .IF 1 = MUSIC_THEME! C4 d* I6 b, z- Y( n& v
- .INCLUDE "data/music/Raf World/config.asm"
) O2 a0 ^- Z k4 j+ w8 Z/ b0 i - .ENDIF
9 @1 h1 ?1 J. ?. k, q8 W4 [4 l -
0 S& t2 b$ f# ]% n0 e- y - .IF 2 = MUSIC_THEME
$ c' x1 u+ }0 j7 Q) X K% U& S - .INCLUDE "data/music/Ninja Gaiden 3/config.asm"8 l% }4 s8 W3 J3 L6 N
- .ENDIF
8 I4 B( h3 ?% T - ( P! t* `3 d6 b( o: D' G, \
- ;======================================================================
8 ?) Z" C2 _3 c7 o+ j - ;引用CHR图像数据
e# e4 Q7 e3 G9 [5 \ - .BANK NES_16KB_PRG_SIZE * 23 k: }% s" d6 @ {0 f4 @
- .ORG $0000
* X' F' d# A! c. W5 r2 T - .INCBIN "data/bkg.chr"' u# ~0 V! r+ k
- .INCBIN "data/sp.chr"
. j @8 ~! |+ a+ f, [; y/ @ - + Z! m6 C: \. _6 V+ W
- ;======================================================================2 J/ D1 ~# r+ L8 P% x
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank
# g8 g: {6 D, I6 d0 j, | P$ _ - .ORG RESET_ADDR
5 ~8 O$ f# K& U# |" D: w x2 k4 H2 u - ;======================================================================* W) u Z' p9 m0 S' _4 A
- ;引用其他源文件
4 B2 L3 e; n4 T' V4 E - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
, a* L* i" _- v$ b6 | - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理. [8 _9 _0 k# K% b4 h
- .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
( x- i( S# U2 y9 H# s1 W - ;======================================================================4 v0 J3 ~5 k$ m) R' c' V& L
- + O6 x6 J% n0 {5 [! u1 D
- ;======================================================================
" a, b/ {* X q& r - ;等待VBlank到来
1 ^( @9 {8 H5 ~' r - Wait_For_VBlank
! ]8 T0 D5 X* v) s! s - LDA PPU_STATUS% t# [7 ]' ~8 G( d) {2 H5 J
- BPL Wait_For_VBlank
1 d, X' }8 Z, q& W) H - RTS( x; x& p h+ T
2 w- _0 t, H& D1 U0 t- ;====================================================================== g ^- G/ ^* R; A/ C
- ;调色板初始化 r' H8 C8 R' Q; e6 a* u
- Palette_Init
4 ^: p; L J" _0 ? - LDA #$3F% }! ~) r: _6 v
- STA PPU_ADDRESS& b- l" u& h$ |: Z' s! @8 r( h
- LDA #$00 c. Z+ B' A; V, U
- STA PPU_ADDRESS
/ b. X/ [9 ]2 O3 \. D! [2 E# g* o - LDX #$00- b! c; l& E% b7 W: }$ n8 T2 z8 T
- LDY #$20
; @- v, R. H8 _# u - .Write_Data
: v# `4 O6 l1 z - LDA Palette_Data,X
0 L+ t* ~" N# _0 h: h( c# G0 S2 H - STA FC_PPU_Pal_Addr,X9 ?1 [9 J8 Z- s; K' M5 Q
- INX% K2 ?9 p( n- v% u
- DEY
! v \$ ^( W. b: k - BNE .Write_Data( t" T- h" e- Q
- .End+ r' K+ Z9 F1 `1 \9 \1 s
- RTS
3 R0 a! @" n! m. ?0 C - ; a9 Z$ k4 k3 w& j: L) E2 Z: i# v
- ;----------------------------------------8 @8 s3 B7 Y d2 Z
- ;调色板数据
' [/ m+ R5 `: H# K' e2 Z% g# d - Palette_Data
2 [" W( v2 e2 ? q - .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
) ^8 Z5 ?& J5 a5 S* K2 b, o' d - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22/ c% } B- i4 X0 t) P/ P) R
-
8 w' v7 N1 r8 i7 W( C - ;======================================================================
$ Z0 ^3 ?& j4 s! V: T. G - ;命名表清空7 `, \, E K+ ~( r: h& G
- Nametable_Clear$ e f# C! B4 Y+ P
- LDA #$20
+ r0 {4 {( L3 _& D# B" m' w - STA PPU_ADDRESS! e$ R; p7 \7 B7 Z: k8 S, k+ d
- LDA #$00
0 r% x3 z7 b% y& Q# ^ - STA PPU_ADDRESS8 t' m$ C0 }4 S% |; Y2 X
- LDA #$00
1 k, N4 A, E9 p6 \7 @2 K2 p2 P - LDX #$00! i& s, G4 C r. ^8 ]' T4 Q9 f P3 C
- LDY #$087 b! \" q7 X ]2 z: z
- .Write_Data1 N0 R4 A8 M M: y# r" Y! m
- STA PPU_DATA' N" w* T5 d7 i8 o4 t" a5 M
- INX1 Q- P$ E! Z0 c/ l
- BNE .Write_Data6 z4 @8 F8 w' e0 N5 I
- DEY
4 ?: |# X% y* P) @: y7 i - BNE .Write_Data
( ]# I5 i3 c, \/ s7 [ - .End
7 ?; D/ H( h: ^% k: V I. X, \9 C - RTS+ _, D5 C8 ^7 v
( c7 M1 i9 O5 ~' V- ;======================================================================( B1 [; r. n& e& `- p3 q! Q
- ;音乐曲目切换
6 d( B: O" u" }" F( ~( ?/ X$ r& S - Music_Select_Process4 J/ i0 G- q9 f/ A
1 d& ? c- x& j# F3 j% G- .Pre_Music;上一曲& t% r) u% i) G- S5 b' q8 Z! U5 o
- LDA FC_Gamepad_Once
& U. k2 }! l o6 l8 D. H - CMP #JOY_KEY_LEFT
- j% O# U' J" A/ u, ], C# L4 u Q - BNE .Next_Music
6 Q! B2 h* m* M8 g4 I7 o - JSR Music_Play_Pre
: m2 ~, U! A& Y1 O% ~; r% ` - .Next_Music;下一曲. o) O4 n( `! t+ m- m7 G
- LDA FC_Gamepad_Once4 _. y1 Z5 P: l
- CMP #JOY_KEY_RIGHT* E: T7 {8 @4 _, _
- BNE .Next_10_Music
) R7 ^+ Z1 T' K - JSR Music_Play_Next
; F& w% J6 n0 ~/ ? ?' ~" f - .Next_10_Music;上10曲
+ j1 p, ~3 f( s6 u - LDA FC_Gamepad_Once" l, d& U- X0 l2 J
- CMP #JOY_KEY_UP7 w- V n9 z! `
- BNE .Pre_10_Music% T* ^! Y! u2 t8 O
- JSR Music_Play_Next_10
2 ]0 h$ G+ c6 f. _- t - .Pre_10_Music;下10曲
4 A3 P9 v' J8 O/ u w0 ] - LDA FC_Gamepad_Once
6 l7 E1 U, Q: G) X& H - CMP #JOY_KEY_DOWN
; l3 r' S+ }2 B: _ - BNE .Reset5 V9 _! S/ x, |% Z
- JSR Music_Play_Pre_10% E$ f, ?$ J: W- s; G+ T
- .Reset;重播当前曲目& o. }5 d- U( b: }0 e
- LDA FC_Gamepad_Once! t) \0 m2 P x5 U, K. a8 v
- CMP #JOY_KEY_START% m# J! i# a$ I/ P: C g
- BNE .End# i1 }' k* b! v, R. `5 Z8 y
- LDA FC_Music_Index o0 q. `4 H$ i1 q; e+ M# g
- JSR Music_Init_Process
% l X& G' Z4 i* K# Z4 G - .End
! z& X5 _2 x3 f* a( V/ X - RTS
& G! V: ~1 S, A
( C- l& l3 R, M- ;----------------------------------------------------------------------, |. V4 f- Q1 H) ~0 }
- ;播放上一曲3 R* X+ t0 F& l, m6 M
- Music_Play_Pre# w1 P5 V4 s' N8 [ G
- LDA FC_Music_Index
1 H. x5 L3 b4 \* w$ b - BEQ .End
& [4 _6 k! j! V$ e* J& ] - DEC FC_Music_Index3 Z/ I& X8 s+ u, y0 E
- LDA FC_Music_Index
# x0 q( E# n1 o: c - JSR Music_Init_Process
( a0 |* x& x9 L, O( S6 Z - .End
$ b3 s0 e! W8 o) [ - RTS
) ? E/ ^# u4 q$ a' y - ;----------------------------------------------------------------------
5 h. J7 w9 R/ T - ;播放下一曲9 J: Y4 P% b/ [
- Music_Play_Next/ y6 c# D( P+ M8 y- \
- LDA FC_Music_Index7 S: v0 A7 U9 x9 P
- CMP FC_Music_Max_Index. S3 {1 m7 r) @ c: u
- BCS .End
. `; `/ p5 m7 {! z4 v3 Y2 s - INC FC_Music_Index
: Z+ B/ u& u, q' i/ X. O - LDA FC_Music_Index% ~9 @# L2 E+ B' E, o' |
- JSR Music_Init_Process
; E, `) Y; f9 R# A* B1 U: g - .End. h2 ^" J# K& N8 w5 P" G& X3 e" `
- RTS) r% p! n7 Q9 `$ E
- & h0 H+ i9 A9 `! J i% J
- ;----------------------------------------------------------------------
! A" C }( q: }0 Y6 z - ;播放上10曲
) H$ W5 ~1 N3 m; q% t - Music_Play_Pre_10. t. v" i, k" t# E
- LDA FC_Music_Index
# R5 Q) A' @- y4 j* L% Y' z - BEQ .End
& @0 N: [* k0 Z& I q4 W0 F - SEC
: H) O1 D" _0 v: m( b - SBC #10
# Q& }7 ?4 A' J4 F/ d. K% o - BCS .Pre_10
9 U# B" W# p& T; L& c3 b' ~ - LDA #$00
' l* P: O4 k3 y) F+ d0 J% ^3 f. E - .Pre_107 @- T9 H+ ]0 h+ e$ t4 ^5 n
- STA FC_Music_Index) b, Q1 e. g3 L. ^9 z+ P; ?' ]
- JSR Music_Init_Process
( ^. b, O% B" t4 n: {+ N - .End* L# W7 }; v8 N5 M* I
- RTS* r' V2 c# G% A0 x
- ;----------------------------------------------------------------------
. ]6 S' ~) z- m K' ^8 J, \0 k! g( K - ;播放下10曲6 }; C+ D7 n$ G2 i D( B
- Music_Play_Next_10$ h' s P" |" [6 M6 |
- LDA FC_Music_Index
4 X5 U% M4 {7 p( K+ M1 P0 n a - CMP FC_Music_Max_Index
$ R4 g# G+ ?* g4 T - BCS .End1 R! k# o- _# m0 d1 n9 r
- CLC
A! U8 y6 e3 @' O; |% V8 q6 q - ADC #10* Y2 Q) v7 E1 A |
- CMP FC_Music_Max_Index
+ t/ a7 M) v# W! J0 o - BCC .Next_10
3 \, @ q+ l4 ^2 \: ? - LDA FC_Music_Max_Index8 r5 P7 P$ L/ c7 ^) _3 b# h
- .Next_10
4 T' D" V/ K# `( d J - STA FC_Music_Index: V3 a# {8 V( n) Y& _
- JSR Music_Init_Process
" ]* ~. j" I0 h( c - .End2 |# s6 O9 b4 @; ^
- RTS4 [8 q+ o+ j0 h1 Z2 P
4 E. _5 E/ z; M- ;----------------------------------------------------------------------
* B$ \2 x( |" T( e; n J2 ] - ;8位十六进制转3位十进制制1 y1 C5 K3 ?: B" [' ~# K
- Hex8ToDec
' O' G8 |; ^# @0 X0 F$ a. ` - STA FC_Dec_Data_1
4 o) e& R2 x0 B+ B - LDA #$00( y+ D: ~9 Z( y; ^7 X
- STA FC_Dec_Data_100( g4 Z6 X& f4 w; I/ G' M
- STA FC_Dec_Data_10
2 [6 s) L+ p+ @6 u$ v - LDA FC_Dec_Data_1; s, v0 y5 R! W8 ~( K
- .Convert_100 g, N+ g2 A: S( B0 V
- CMP #100- @2 ? K5 W* w7 J
- BCC .Convert_10% K& |& U) a. c: Y, y; F% a! g
- SEC
' E8 E3 `0 P8 h/ O( x8 r/ ? - SBC #100
+ @/ E6 ?4 V' y/ I - INC FC_Dec_Data_100
8 R" Y% E( o6 p; U4 _ - BNE .Convert_100
. E% R" q5 a6 U$ w, J. g; d6 c - .Convert_10
1 l* }6 U4 }3 i3 A( X - CMP #10
$ S- k, z' z' i) @ - BCC .End5 U; }5 \8 g: ?/ ]' a" f
- SEC
- ?- b7 f4 i5 B0 _' h- t - SBC #10
; @* C& B) n. k. e- }- Q# { - INC FC_Dec_Data_102 ?* X+ n3 o& n, O: u3 {
- BNE .Convert_10& [: m; b6 [+ _! B1 c+ D8 B$ Y
- .End
+ p9 j0 x& j( p9 z - STA FC_Dec_Data_1 p& V7 Z3 p: l# e! _
- RTS. f a7 |1 y+ B- u9 R
- 5 S4 W7 }$ w" n9 J* F0 V: e
- ;----------------------------------------------------------------------
5 f3 g* m4 {8 K/ r - ;显示曲目信息
/ J! P+ S! L c" |" R0 b j - Music_Info_Display
( Q; O7 m+ F$ V/ O - LDX FC_PPU_Buf_Count
]2 O/ |! S* s1 |( N) B6 x" y! Y$ I - LDA #PPU_WRITE_MODE_CNT_LINE" l3 E7 X" A% u4 `$ G
- STA Use_PPU_Buffer,X
8 M) n: N2 k. K/ w$ n, W - INX7 f0 ]% [7 [ O; p/ G! C# T# ?# M
-
* ~/ F* ~" V+ T0 Z - LDA #>MUSIC_INFO_POS
6 d9 n5 P. u. K8 c - STA Use_PPU_Buffer,X$ ^$ s- `: k+ [- C- p# L+ I, V
- INX. Q* H7 [8 j7 |6 d/ w* M
-
' t6 y: y( w4 V* a - ;居中/ P! r! o# b4 L- D, o! o
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2& l6 E; F, {" n+ A! R
- STA Use_PPU_Buffer,X* E* \+ O" B, Q" r2 ^5 x
- INX
! U0 l, C, t/ T& ~ -
1 t# P1 G1 `1 w* L! `. I# J - LDA #$05
# `: y- c2 ^5 v! m0 L( U& J - STA Use_PPU_Buffer,X. B' A, \ C$ i- {/ `9 s
- INX& m0 f3 g! W! M" k8 W+ k: w5 |
-
) n/ m: Q( @; U - LDA FC_Music_Index) A8 F, Q6 x$ o2 Z) A1 M U& K( x) Y
- CLC5 B- j9 x" H1 A
- ADC #$01
9 j% _; x7 p' [: |. j2 o( ?+ ] - JSR Hex8ToDec
2 S- [; ?$ T1 h2 C2 m7 W% c, l; B - 2 A0 k1 _5 ~2 n8 Y0 Q2 P# e+ x
- LDA FC_Dec_Data_10/ K$ ?, k/ w: T; }5 ?3 T
- CLC* a3 j3 B$ A, B% R, g. s; K7 ?, w# z
- ADC #'0'/ U/ H: h0 w, h+ u0 S, y. G/ Y
- STA Use_PPU_Buffer,X
1 t3 }) r' m/ f& X0 A - INX
0 F3 e& @0 @9 V3 k* T% p) n - , i& K. L3 H! |" K+ }
- LDA FC_Dec_Data_1
" u, {% u# X: d, g$ j - CLC+ A& |! q7 h1 f. O$ `
- ADC #'0'+ o( m. q% Z0 R/ |
- STA Use_PPU_Buffer,X! s$ o+ c$ J/ V7 c. C3 f
- INX
. T: _6 d% u9 m1 b - , L( q5 @5 s5 [3 s' d
- LDA #'/'" y3 O; D0 s% @- y. V+ v' F( N
- STA Use_PPU_Buffer,X _5 y% S& Z' s* B/ l8 p
- INX; c \' i' w- f+ ]2 s
- * t8 y- _2 o" J. h3 h
- LDA FC_Music_Max_Index
* u+ o; n$ b! q6 }2 Q - CLC6 v; a+ d' @8 C
- ADC #$01
% s" o, k2 E2 V' _, _ l - JSR Hex8ToDec! P5 H' M) ~$ m( @( J( z
- ! h8 I) [% d: ]$ V, V8 ]: I) Q% n
- LDA FC_Dec_Data_10" D2 s5 N; L5 i2 o& ]
- CLC
6 X. h; [+ n# O, S ?& _" N - ADC #'0'
, `, W. z' @1 z0 @5 \( a* E- ` - STA Use_PPU_Buffer,X
% p0 P! t3 E e2 r% O - INX2 ^, X( S+ N2 E
- % Z5 {( f0 ~2 n+ P# e8 B
- LDA FC_Dec_Data_19 J/ F% {4 `, g3 K+ v
- CLC) l; X9 j3 a9 V( E. ^* |3 t2 a) g
- ADC #'0'( C2 e' l, E9 x, S7 b6 m- `; i
- STA Use_PPU_Buffer,X% s4 p; Z" H, ^# I' V9 D
- INX
1 b/ c! c1 E8 O$ B - % N/ r" p& e v: O5 a5 @
- .End" Z2 V \. e5 }! f d0 L
- STX FC_PPU_Buf_Count& d7 M( i+ x! Z* p. r
- RTS* c4 n1 A) l$ u+ d6 p
- : B1 z/ E' s$ P( Q9 \
- ;----------------------------------------------------------------------
5 ]3 y& ?- S5 L - ;音乐曲目初始化处理4 @2 u6 t6 a/ P
- Music_Init_Process
- c7 D l! b6 A+ f- G* H - PHA
! b$ l2 D+ x `, i9 N$ n9 ? - JSR Music_Clear_Process
5 ~7 h9 H: x: w0 o# x: | - LDA #$1F2 O% G3 n' j- A! l) B
- STA $40152 l% x& u( U9 n, y/ ?' ~2 U! W {
- PLA- @# {! K' `0 X( T$ L& Y$ b
- JSR Music_Init_Addr
6 K7 n, _5 N: z& T$ }8 K8 K - JSR Music_Info_Display( l0 s0 i" s- H; W; C
- RTS
( n; v5 e4 b& h4 I - 8 K0 D6 i+ n/ ?% o! v( N: i
- ;----------------------------------------------------------------------
: M3 ~- n5 R: ]1 w0 G ? I7 L4 _ - ;音乐播放处理# T) m* w9 |4 \. I
- Music_Play_Process
! u: ?1 z: g9 K5 A - JSR Music_Play_Addr8 a0 i; T1 S4 ~' j/ V) g
- RTS \$ `" h. E% A* |( w: L
: v) K9 x* }% E8 u* f- ;----------------------------------------------------------------------3 I( D" s+ a. R( t, b
- ;音乐播放处理0 q% ]' p s3 X% A$ y6 u7 R+ [. U
- Music_Clear_Process6 {. c! O# |( a! D% l
- .IF Music_Clear_Addr$ U/ n% o. x9 E0 E4 u
- JSR Music_Clear_Addr; s. g7 Z; R) _2 A5 L5 l- g8 |
- RTS& z, }4 i3 U6 e; }
- .ELSE
, ^4 y' m$ F+ O) R; w* d - LDA #$1F: J, D8 A+ p) r# v) [" B6 z5 ~
- STA $40158 N, Z3 ~! `+ L+ @5 ]' J& f: P0 d
- LDA #$00
- ]; c6 l" n. n7 a8 m6 E+ Y& u, p - STA $4010/ T6 g* Y% ?& m" C
- LDX #$00
1 J/ t) i8 J9 U7 M4 c" S - LDA #$005 T0 ~" K: f* G6 f+ d
-
" k) i4 H. ^: ~: ?" b" h- g7 s _0 Z - .Music_Clear_Zreo_Page_0! v* q7 L$ V5 u' e' J; |7 q
- STA $00,X
' @0 k/ j4 \) b' i/ d5 } - INX
7 Y2 [8 s, L: ~. q1 u' ~5 L9 p - CPX #Use_Zero_Page_Begin4 h# y5 e- b9 N. a
- BCC .Music_Clear_Zreo_Page_01 j1 ?3 g. L/ X
- " E% H( [! Q8 j6 `# p
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size% D4 _- w4 X: a: A4 j
- .Music_Clear_Zreo_Page_19 `- q5 Z5 D; a6 s) O
- STA $00,X" M2 x+ _1 g% j; ]( a* d6 B
- INX
5 i$ q. X3 l$ h! _7 l- Z3 o9 A - BNE .Music_Clear_Zreo_Page_1
( ?7 u6 }" v5 B1 L: p* } - ) u9 K6 s6 E: `# l
- Music_Clear_Process_1$ @% F4 H; n: h& V V
- STA $0600,X1 _$ S* E$ o7 h- d
- STA $0700,X7 l1 v" g" E v9 ?6 T0 |& {2 w
- INX
& J; U. L3 Y! v S2 ~( C - BNE Music_Clear_Process_1
3 Q' L1 q& B- _# N. } - LDA #$10
& [; k* H5 w4 H. M2 K# @ - STA $4000+ N; s; p! p5 r: a9 E
- STA $4004/ B; Z( b: p8 v$ X9 ^
- STA $400C. o' O4 v" r! O" {9 m3 b
- LDA #$00
' E9 b8 i, ]) G5 E! F - STA $4008
$ f ]7 c2 C0 V* \: J - LDA #$0F
# d/ ]2 j u4 \2 Q* {/ ^6 }, h - STA $4015
) c" E: V) _. A& A2 u/ ~0 a( E p - .ENDIF
4 o9 R0 f$ |3 N8 P" ` -
- t- N' {3 ^# ?) [; s% G0 F- B) T - RTS4 R' v$ Q$ W6 L( W" U( }+ ~% i. B
" L( I$ i" x# K; y9 I4 P, Y- ;======================================================================
2 F2 b2 u4 w1 m) | - ;重启处理4 e$ Z1 I$ k7 D. V2 [
- Reset_Program! p* _ a; q1 u- X% Q) d! i( S
- SEI
/ S: r& N! x2 F" J; ~ - CLD1 E. z3 z8 r; j
- LDA #$00
/ v7 j; u7 W6 q/ @ - STA PPU_CTRL/ ^3 @ {2 G8 y" A9 {
- STA PPU_MASK
4 Q) n0 u1 `/ E! l0 q; ^1 [ - STA JOY2_FRAME
$ k- ~3 d& H, `: L# U - STA APU_STATUS1 K. }- q! J2 f: O
- $ o* c2 P7 T/ |, o, c
- ;等待屏幕准备完毕
, K) v" ]0 t- ~ - LDX #$02* \* T: d+ m1 {
- .Wait_For_Screen_Ready8 m2 g0 v" q' A2 v1 `2 Y: f# q
- LDA PPU_STATUS8 t: M" A4 v# t) u% P, g
- BPL .Wait_For_Screen_Ready
3 i4 u Z7 a: D8 }: ^ - DEX
4 d$ h4 T/ u% W$ v c - BNE .Wait_For_Screen_Ready
; r+ B( t: O5 }- ?1 c -
0 [% H# V7 B& t$ `$ B - ;清空调色板
. s Y8 M+ z! i- h$ i$ K i - Palette_Clear! v1 y' @1 p) W. S8 w. W3 [
- LDA #$3F. y) p$ Q& [8 w0 A7 f2 y$ q
- STA PPU_ADDRESS
. G- K+ z$ X5 Y0 i$ `6 d - LDA #$00
2 k* o; {# R- H4 k$ o2 |8 Z: O* \ - STA PPU_ADDRESS
9 {& g/ ]/ \. g - LDX #$20
2 D) P+ `8 a1 |6 m7 f. S9 {% f - LDA #$0F
" ^ t+ Y' | ?- _8 R1 u6 Y) U# J k( b - .Write_Data
% v$ [6 A. n4 h) D9 H - STA PPU_DATA( l% ^+ ?* `' ~
- DEX6 T$ Y u! a3 [9 \
- BNE .Write_Data" ]9 _: y5 ?1 m% K. b3 c' h% X" J
0 ?' D2 F* m0 f4 T0 H- ;清除声音 $4000-40138 T- \ i6 r# Y* J2 c$ _9 W& v
- LDY #$143 w- K3 O# Z1 v. z7 i& F/ t
- LDX #$00
3 k- T5 G; R8 V( E5 R9 { - .Sound_Clear) o1 t7 W9 I1 F0 {
- STA $4000,X( [& j& u, ^4 _7 t- G
- INX1 L7 }* \& b# B. s5 C! [
- DEY
+ N3 Y& x, N* O" l - BNE .Sound_Clear; J, C- k" C! T/ @7 ~ Z" D4 l1 E
-
7 [% S% [8 G) U, |' v; s' R - ;清除 RAM $0000-07FF8 j! h3 X3 c6 U( T
- LDA #$00
4 ?7 e9 }8 p4 V7 M& g4 A - STA $00
; Y5 w+ y g9 p/ `9 m4 B6 Q# ]4 K& a - STA $01: S/ e1 s$ y. k5 x5 k
- TAY
. N9 n4 v$ }* a- _6 }+ I - LDX #$08
# ~- z# n* j; g5 A - .Memory_Clear7 a3 A2 v- f7 I+ N2 u
- STA [$00],Y0 j' ]& _& z( X6 M. T3 K4 X
- INY
/ L. c2 \, P u - BNE .Memory_Clear' N+ d7 C1 P5 y% t3 ^) T0 I
- INC $016 a" ~* i8 _ M
- DEX" J! u* x, R I8 p
- BNE .Memory_Clear" k5 J. d2 W; W! o9 {: R' \; q
- , x" ]+ M" d. \5 h- o
- ;精灵缓冲初始化+ i2 e1 y- J, w2 ^! F
- LDX #$002 ?7 A5 o! Y4 M
- LDA #$F8
- c: r+ ~( l, _1 J" I% \ - .OAM_Clear& c8 `1 Z1 } N6 ?9 {+ |
- STA OAM_DMA_Buffer,X* _5 ?' \% J5 f* ^" |" Y
- INX {* e/ Z$ y) {' b$ I" U
- BNE .OAM_Clear7 @# ~0 J1 X% N* J+ A7 }: n% V
- ! ?! J; f/ B Q4 A9 |
- ;栈指针初始化
. Q& g3 ]/ f! x% [* a - LDX #$FF! {7 w. y% X+ Y5 }
- TXS
) y f, o* B% O+ Q. p7 g -
" z; q. ?+ X* G. |5 p4 i! P1 B0 }8 b - JSR Nametable_Clear;命名表清空" R7 ]- V+ i. G! q
- JSR Palette_Init;初始化调色板缓冲+ t h {& }6 [- W/ X5 V# S. f
- JSR Static_Text_Init;初始化静态文本
0 w7 l6 c* L$ h/ j+ w$ [2 e -
, Q( {# I1 E, i6 J. i$ f6 X/ n - LDA #MUSIC_ITEM_TOTAL - 1
/ [1 f* {7 H( i8 p5 y4 ~ - STA FC_Music_Max_Index- k4 H1 j" l' P8 t3 W4 z7 \
- - B1 ~2 e3 V) }, B; i1 ^' C
- LDA #$1F
( d8 Q: h2 J2 w: R - STA APU_STATUS
1 e/ g! p5 Z- w: C1 Y% q - LDA #MUSIC_BGM - 1! n* b- N* P6 B& _; ^* E
- STA FC_Music_Index
) z3 ]7 a7 z4 R/ A - JSR Music_Init_Process;音乐播放
. M" i/ v" Z; T$ s4 s( h( ?1 Q; F -
4 }3 O2 E% h0 ~) A5 C( c - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)/ i' Q2 W2 \9 g) k
- LDA #$1E
9 N" B1 R, @( c, X - STA FC_PPU_Mask_Buf
; F+ W% {& @1 {: d# `/ c" Y% U8 o/ E - / l' H: t) W- N k
- ;启用NMI处理0 z- ]0 e, ^: T4 a8 r
- LDA #$80
8 j0 K) D5 |7 q% f - STA PPU_CTRL5 M2 S1 V8 P8 F& X# F
-
4 {: w: y) |/ y4 X - ;程序循环, 剩余工作交给 NMI 中断处理
& m9 Y) u. H) \2 P1 i - .Loop
# q* u6 V' k& g4 ?0 t - JMP .Loop
- H- I% N. g+ @* Q ] K* Z
; A3 g2 V# L6 _6 c% D- ;======================================================================
" R! [& L) P1 A$ K. m; A$ A* G - ;不可屏蔽中断处理
) k( W( ?+ M0 q0 F - Nmi_Program& L) r' q3 s; U! l" J2 l8 L/ R: v
- PHA2 W/ e- W- g) `) K$ E
- TXA& i$ c5 F. h! N! S
- PHA$ r9 t0 V( @9 H4 `1 W- j! w
- TYA
9 J$ e3 a: P, w% f# Q. Q - PHA
" A3 y8 H5 u T7 s -
. [8 T+ }# j- C4 o - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
0 g6 E! j3 ]$ w/ a3 X$ a _4 O -
7 x% f$ a% Z9 O# z4 x9 J - JSR FC_PPU_Procrss;PPU处理
" L0 S0 \- L3 L* N# B3 O -
, h$ [; E7 t8 Z - ;精灵内存更新% d1 j4 ]$ }4 d% a# v3 c) q9 w H
- LDA #$00; ~. g! }$ x [: p+ K0 P
- STA PPU_OAM_ADDR; x" x5 N. y- y5 y5 ~
- LDA #OAM_DMA_Buffer / $0100
. l# l. J: C9 }1 O - STA OAM_DMA
, S- S7 {) w0 V' t# | -
" z; Y3 s) E% ] M& ~+ E - JSR FC_Gamepad_Process;手柄输入处理
1 h( W: O. ?) p - JSR Music_Select_Process;音乐选曲处理
2 Z, _9 w$ V- F3 U f, ~2 ` - JSR Music_Play_Process;音乐播放处理6 L) M6 e9 N( O2 M3 V& M
- ) T+ T- C2 j( M+ U; r
- PLA0 Z9 Y j- L( h2 Y
- TAY1 ^+ _0 C ^& Z; d7 }+ ], e0 F' {
- PLA* ?. }# @4 g( o4 L7 A1 h! |
- TAX
+ u4 s4 V4 P* }3 D6 L* i - PLA5 h5 T! C( f9 ]
- 5 y6 Y. @# Q0 e( x
- RTI
7 v+ w3 _% O, J. G+ e. G) j
+ q- b3 {/ Z* @2 [1 {9 P- ;======================================================================/ x8 B0 k' N7 a5 T9 W
- ;请求中断处理
& R+ V6 z4 E- x9 U. q& X2 Y% W - Irq_Program
8 ^" b5 [& c# k - RTI
) a5 p8 B; Z* Y9 i0 q* n$ ~
0 j5 v" r$ q6 U2 b1 @ J( z2 h- ;======================================================================
$ d* U v! f5 @- r1 f0 t - ;中断向量表
6 I( y/ D9 r) q5 f' M3 ~6 Y - .ORG $FFFA, c; `4 \+ Q0 C$ H8 }& i z
- .DW Nmi_Program ;NMI触发时执行 p2 R# ?7 n* J T
- .DW Reset_Program ;载入ROM时最先执行3 Q ~7 C7 d' Q5 b& l8 y
- .DW Irq_Program ;IRQ触发时执行" x _3 U) P5 L2 D; `) t7 A
复制代码 - F a' q1 q/ L3 A9 z) X3 F- x
4 \' d# ]+ W# |" E- J( T2 ^- C# ]0 Y
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|