|
|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下0 q: Z& z1 C5 Z! _+ @* L

* k, t( t* B1 T+ _6 |以下是主框架代码:7 y. C. ?* @7 h n9 f& r
- ;======================================================================+ F2 ?, z( |! S
- ;文件头2 G, K" t- }- |
- NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量
, |% q6 ~9 S: P* h* J) N - NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量; [1 G% M/ \5 V
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码, D5 }- E5 z' W( M* A
- ;======================================================================, K( c$ R" z" J; Z$ ?/ N
- PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2$ F% Y$ C/ ]3 }2 b
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
0 a" y* t% ?# D6 v3 n' O* _1 D - ;======================================================================
! O: L* b8 H' r) g! ?$ Z! b - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
; p3 o# X9 I9 g6 n' e, Q; A1 X - RESET_ADDR = $E000 ;主程序起始地址/ m) L' d. m7 A6 w0 Q
- ;======================================================================5 Q/ ^- b% F6 h2 ~- X
- .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB/ }4 [+ q/ E4 Z0 J* }/ }3 E
- .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
4 J. |2 S/ s6 i) g4 o) K - .INESMAP 4 ;Mapper号 (0-4095)
2 N2 X( Q; l% u0 K - .INESSUBMAP 0 ;子Mapper号 (0-15)7 O1 S& O- b9 Q
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)6 P3 P' _" y3 w
- .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)
- ?! y M+ b' X. M+ b- a: u - .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)
7 r1 c0 _. L+ |) i - .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)5 \5 z$ A/ j- b5 ]$ e7 e0 A3 q: y( B! L
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数) D4 M% j m* N8 O6 E
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)9 ^# O8 q8 e1 f5 {
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)
/ t" b, c( }5 E5 W% l! r+ U - ;======================================================================
4 i- h' C# I+ S+ p* c6 L; j - .INCLUDE "fc_demo_config.asm" ;全局配置
9 L2 H# |( |: D1 x4 u0 e0 \ - .INCLUDE "fc_demo_constant.asm" ;NES常量" e3 A1 n8 X7 R* a1 a
- ;======================================================================+ B9 `% a5 d* m" [$ [
- ;音乐配置8 P% ^! t( [, [3 [/ H1 d. w( Q
- .IF 0 = MUSIC_THEME
' P( B! N/ A3 p* ~6 X8 U - .INCLUDE "data/music/Gremlin 2/config.asm"
& D3 s9 g8 Z5 N6 ]/ M6 Q - .ENDIF0 D: j$ m8 n) x( D8 {9 z q p
- $ R! d; h+ ~ Y a L7 I7 S' R
- .IF 1 = MUSIC_THEME( a- M2 R2 `+ ]' z: {& q
- .INCLUDE "data/music/Raf World/config.asm"
& r% Z" h* r+ J0 K: Z - .ENDIF
9 g, n; r' C- E: f9 B6 n3 N - 6 y% V$ s: g% s# L1 n2 h8 d
- .IF 2 = MUSIC_THEME 4 V4 a0 L5 Q E5 l. J4 u+ Z- f: Z
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
: v6 Y* k/ k. n5 M: L - .ENDIF* I# b3 o7 O& E3 ?
- 3 S6 i$ [& M3 I* M+ X; \
- ;======================================================================% z8 L( y7 `4 [+ {
- ;引用CHR图像数据( {( a& L$ t9 ~1 z1 r3 m# @- t
- .BANK NES_16KB_PRG_SIZE * 28 t) A* [5 @; E# {* p
- .ORG $0000
% t& P: B m0 ? K9 Y9 P - .INCBIN "data/bkg.chr"
* ~! L9 ^! A, F; J - .INCBIN "data/sp.chr"% X7 y. n5 L9 m6 v/ b
- - D+ {- t: f$ I0 R5 |7 Y+ P# G
- ;======================================================================
- u8 {, a3 i- J7 Q- g - .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank$ A# H# J/ v$ q2 M5 W, y3 {5 K
- .ORG RESET_ADDR% X5 y" B& K7 X( k2 E" B! ?; Q) x! J
- ;======================================================================. e" I; r6 p4 E* E+ ]4 n
- ;引用其他源文件% C% g0 p6 p3 K w# X7 s
- .INCLUDE "fc_demo_ppu.asm" ;PPU处理
0 A! c( ~7 F, a# p1 T - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
5 l/ Z+ e* J2 V1 J: p. B' Q - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理
$ R& P/ V) G7 V& `( g E M+ O - ;======================================================================5 J2 H5 l, M7 X( L' h
- + _6 k: {# F( | K
- ;======================================================================3 c4 S2 p5 Y, ^& q5 s! C; s# Y' Z* r
- ;等待VBlank到来
$ m7 m1 ~9 ^! I O - Wait_For_VBlank
, F) G0 B$ M: B- ?8 g$ H - LDA PPU_STATUS
C2 |; t& S) T, e: } - BPL Wait_For_VBlank
6 Q+ c: D( _+ s3 g( T$ q1 m - RTS1 T1 S% B8 H4 q! W" R3 ^* p5 o
~# M, O5 b. f! y- ;======================================================================
* O. f* `1 H" H" y: | - ;调色板初始化$ }9 P7 K, z* q% h$ G
- Palette_Init2 b3 { T9 I7 f& h
- LDA #$3F9 p. J. y" ]9 {; q0 ^
- STA PPU_ADDRESS
; x1 s8 ~/ u7 ]6 @5 } - LDA #$00
+ R/ V8 z. e) E, Z - STA PPU_ADDRESS
/ N5 g' x, k- ` - LDX #$00$ |/ u* t6 E3 Y' \$ A Y
- LDY #$20
/ E/ _3 g Y6 ?( C5 n. d5 j# x, X - .Write_Data5 g+ E* W2 C+ h$ Z" ?
- LDA Palette_Data,X
0 s. ]: v4 j3 A& ?0 P" m - STA FC_PPU_Pal_Addr,X
5 C: A0 j3 ^: ]9 g$ |5 Y - INX
( Z# S9 Q4 ^0 L1 ~! ~! T - DEY- M" A( g- Z3 k8 f }
- BNE .Write_Data
7 K8 C2 E$ z- _/ @1 P - .End' ^& N _+ p/ W! a% C. m' u* j7 u
- RTS
( m* I5 r$ g) v) d. c: _ - 6 G s: M% d9 i2 {+ l" l& G
- ;----------------------------------------
6 Z0 p$ U1 F) M; v - ;调色板数据, C7 w0 ^8 V* A/ B# ^
- Palette_Data4 o) u$ L- U/ D$ E
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B
& b8 J" K* w3 d0 T/ z - .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
$ N" E7 z0 G; w -
. B3 v! d7 e9 J$ u! ~ - ;======================================================================$ j: @+ |5 s' g9 v: L
- ;命名表清空1 t. P( }/ r3 C0 g4 T' C6 s2 s8 ^
- Nametable_Clear
% o- m' K8 M, i6 @0 ] X - LDA #$20
* S W( J2 T( M' Q1 i - STA PPU_ADDRESS+ u- {) M! c& l$ a# p; W4 E+ h
- LDA #$00
2 y; ~/ l3 E' a5 v - STA PPU_ADDRESS' ^ }, \" W6 E
- LDA #$00- Q4 z( r; k9 m: g( k
- LDX #$00
0 m+ Q) t h% e1 c8 }, M2 S - LDY #$08% }( i: F2 @, A; y
- .Write_Data
5 u9 _0 F, n/ Y! Q - STA PPU_DATA$ N" h" G& h5 O% v! K8 s7 r" { X
- INX3 v; ^1 B3 V6 U/ W# j3 h
- BNE .Write_Data/ Q/ f3 \' S& t j+ Z8 I8 ~
- DEY c* ~* S+ l1 u* j
- BNE .Write_Data! [# [2 N$ N2 x: n
- .End
& p, A# v- i* o( s( O - RTS
4 n O+ }! h* j1 m7 Y! Y+ ~ - 2 |3 J( ?! o4 I4 Y4 ~; b N
- ;======================================================================
P' X! K4 G5 E2 @, r5 V - ;音乐曲目切换
9 m9 B" u3 {" w - Music_Select_Process* B n2 W9 f" U5 I) H/ P" b- o
0 G9 @2 k8 ]) t8 b: E- .Pre_Music;上一曲
; ?# O# P( f3 v+ s8 Z% O$ h - LDA FC_Gamepad_Once8 x. _! L6 U; S. |; H Q
- CMP #JOY_KEY_LEFT" b4 g* Q% y4 \4 s6 }
- BNE .Next_Music+ l+ r: j" d! h- i
- JSR Music_Play_Pre1 o1 j2 |# j! p) b$ m9 I
- .Next_Music;下一曲
% U# [$ `6 _0 p% G8 z - LDA FC_Gamepad_Once
) P' q2 y- E) ?, h2 | - CMP #JOY_KEY_RIGHT8 W6 Z! I% p8 ^" Z' t
- BNE .Next_10_Music
4 B' G. z3 f5 g1 e# F- L" _; G; d! [1 @ - JSR Music_Play_Next( I' w6 W, _' I" R4 ?
- .Next_10_Music;上10曲
& R. C9 d1 h3 {* I6 V2 `4 Y - LDA FC_Gamepad_Once
2 B3 z5 |! y% s" { - CMP #JOY_KEY_UP
% k# X+ l, @" D1 ~ ^: w - BNE .Pre_10_Music
$ A* o# A7 h6 k - JSR Music_Play_Next_10* y" Z3 a/ {0 ~" P
- .Pre_10_Music;下10曲
2 h, H# L; P; y6 F8 u - LDA FC_Gamepad_Once7 i0 U4 R( ^7 E7 p9 `
- CMP #JOY_KEY_DOWN- _+ M( n5 }9 u; S2 N4 h
- BNE .Reset9 N# S( u, y/ f2 ^/ e
- JSR Music_Play_Pre_10" G$ e& w+ X- J8 n8 U
- .Reset;重播当前曲目
9 c6 R; a) l/ Y2 }2 z- f- ^ - LDA FC_Gamepad_Once9 O5 p+ R) J1 v4 t! o" j6 K
- CMP #JOY_KEY_START
" s6 n: }0 w4 w8 V4 y - BNE .End
' \$ U8 Y. G8 {% S - LDA FC_Music_Index* k$ K1 V, K) l. x& a. M
- JSR Music_Init_Process( h8 X, T% ]9 r
- .End! A, Z, ]* h' ?. ?$ X
- RTS: J4 s' I' j3 Z5 w9 q( j7 \) |; |$ `
- 4 i$ J1 |% A# M* ^6 A- R# r# {
- ;----------------------------------------------------------------------3 |+ h7 k) O2 h. w z0 F
- ;播放上一曲$ z& b+ Q7 E) R8 Q8 Y
- Music_Play_Pre
+ G3 N$ X3 r5 D4 K+ I9 Z$ E" F - LDA FC_Music_Index
) Z1 K0 T% w, ^" b3 [& E - BEQ .End$ ]2 y4 V. Y8 M+ g: _
- DEC FC_Music_Index
/ X, f) B( U7 D* k# ] - LDA FC_Music_Index
- `' W5 X, o% `) K( F+ m - JSR Music_Init_Process' M" G) t5 |7 V2 B
- .End# X: j, W5 C5 H9 U/ R
- RTS
7 r) M' c: G3 x - ;----------------------------------------------------------------------
& n# q! \* z. ^' k+ K - ;播放下一曲
- N/ v2 Q, C7 F" o0 G- R. ]' d4 l- I. z - Music_Play_Next
7 A' w1 x$ Z2 C4 S! n1 F' _- F - LDA FC_Music_Index/ W% T. o, u2 G/ k( c/ Z2 C6 q" }. o
- CMP FC_Music_Max_Index9 c' b3 i& s, U
- BCS .End
1 {( p1 d6 G& t- X/ i/ l k - INC FC_Music_Index
0 j) v% r* `4 a( W9 o' K: C - LDA FC_Music_Index, i% ]# h7 }6 n8 x8 O/ h6 l* s a
- JSR Music_Init_Process
4 h* \) O$ L* Z6 @# G8 j: ? - .End
' o4 ~5 L1 U' B2 B - RTS
% ?$ ~! ^5 q$ B
' M: Y: d+ m# n/ _$ U4 r- ;----------------------------------------------------------------------
8 o+ D$ R) y& o+ D - ;播放上10曲
. ~+ c" z6 z% p3 j | - Music_Play_Pre_10- ? V: ]& d. m$ R: b7 M1 V
- LDA FC_Music_Index
1 N4 ]* [& `+ q( J - BEQ .End
* S9 _2 C( J( r1 E0 w$ ]0 j: q - SEC. b9 d$ t# B( h
- SBC #10
2 `, C+ `7 q7 E6 _4 k: x, Q - BCS .Pre_10
4 F0 X7 \6 _* Q+ G - LDA #$00" K6 s [+ B0 {0 ~' \( T4 x% x: w
- .Pre_10
( O8 H: X2 |! z* _) G1 q - STA FC_Music_Index* K: a" \9 ?9 [* K3 n) \7 g: S
- JSR Music_Init_Process* i) J4 ]" `2 X8 o; O" ?
- .End& f Z5 ]6 x, E1 O" p$ g
- RTS4 ` b% i# r9 ]$ D2 [; q" k. B' o
- ;----------------------------------------------------------------------
/ t$ s, w8 F* l' j D - ;播放下10曲2 K9 F% @) p: n- p1 Q0 Z- g
- Music_Play_Next_101 Q" U! O1 }/ k- _
- LDA FC_Music_Index' j, [. r: C9 V6 g" i
- CMP FC_Music_Max_Index
" _7 K6 J- q9 U' x( p3 { - BCS .End
- D$ `$ t) i$ V' g6 p0 x8 E - CLC
6 L4 I4 M! c: f+ x0 r# e - ADC #10
$ }: v1 n7 a# \# f3 B* b7 D0 d0 | - CMP FC_Music_Max_Index
1 l; D# \; q. T7 r5 _: _8 z - BCC .Next_10
4 _7 v! _9 u; |, V1 J - LDA FC_Music_Max_Index
! ^; _7 r! _, ?! [$ Q5 O/ E - .Next_10$ T" H1 J' Y3 h6 R1 G; T
- STA FC_Music_Index
+ p$ _( Z" [9 ~0 D. j - JSR Music_Init_Process
3 Y* }9 X! U: D - .End$ u# J; S% B0 B; p
- RTS
! P8 V' N+ G0 K9 E2 G - : q1 K$ ^' s; C% U& x
- ;----------------------------------------------------------------------
' E% }+ {8 c5 {& b7 U9 Y! L - ;8位十六进制转3位十进制制3 f6 W: ~; S# y; O- t/ j
- Hex8ToDec( w; R$ w+ }) T2 A0 N
- STA FC_Dec_Data_1( C; @, X" b) l- J
- LDA #$00% @) f2 ?' u, u# B0 w' f
- STA FC_Dec_Data_100
8 t8 r" D& h0 ~) g7 Y - STA FC_Dec_Data_10; Y$ X! O0 f, w, B
- LDA FC_Dec_Data_1
1 s- i( ?9 h6 H$ X w5 i5 B - .Convert_100
- S- C& P3 V# }* G - CMP #100
4 Z! r `7 i) u9 @$ M# d; U - BCC .Convert_10
) y! e0 ], C; L- b/ V) k5 T$ s4 A; { - SEC3 v; N" Q* N+ ~1 c9 D4 ?
- SBC #100
, w' F; S( T7 Y- p - INC FC_Dec_Data_100
n7 n. K* v/ x - BNE .Convert_100/ [3 i$ U5 D; e! G3 h* B# p
- .Convert_10( M9 ~! h* t; p+ d7 b' @6 I
- CMP #10+ w9 D% `7 t- t
- BCC .End3 v% }& { Z4 j0 Q3 _8 B- \
- SEC
- h" z7 y- N+ q! R- ` - SBC #107 P% G+ g- w. M, P" U5 m
- INC FC_Dec_Data_10, |6 @! k3 O7 h1 L1 V3 n% F& u1 }
- BNE .Convert_10
3 T" v$ g$ |. y6 k W+ E - .End
9 w, @6 ^) i9 z9 N# V6 P, R - STA FC_Dec_Data_1
, D5 C2 N+ |6 D: S; }5 ^ - RTS
$ k5 ~" l4 P& ~& M/ b
6 b. R C ]4 E( Y' _& ]- ;----------------------------------------------------------------------+ k i, R& q" V l3 `* g2 r
- ;显示曲目信息 ^5 Z* J; n- N
- Music_Info_Display
4 o- M- ]9 N4 [; h# G - LDX FC_PPU_Buf_Count6 Q- g. O2 w5 K1 l. |1 D
- LDA #PPU_WRITE_MODE_CNT_LINE3 q* Q7 w% v+ a$ D
- STA Use_PPU_Buffer,X0 V9 ^( K5 H9 q
- INX& ~$ b6 ?" Q8 F3 x# n& W' n1 V
- " H- m% C$ ?5 b9 k5 o
- LDA #>MUSIC_INFO_POS& p/ G1 u$ r8 W
- STA Use_PPU_Buffer,X# ?! l7 u& L. K2 y% P a3 Z- _
- INX
/ t# A: X' v. w6 Y9 Z - ! |% f1 Z" | c: `
- ;居中
' z3 c. w/ [# z. B' H' ?# l. ?& D1 i7 A - LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2
, u! t2 L6 G- K8 S0 J3 m8 R - STA Use_PPU_Buffer,X
& }& y, `5 d" b$ O8 K. x+ { - INX
6 h3 `' _; Z$ R& S1 z - 7 J6 M, t \% \, Q- ?) W! @
- LDA #$057 G# n0 [* P6 k( Q& P& t
- STA Use_PPU_Buffer,X- Q' R, y6 Z( |& L) \
- INX
2 P& ~% Q7 x1 H- w4 e! [/ i% Q' d& y -
( h) J) O) f. S5 {* |6 u- G3 ], @ - LDA FC_Music_Index
u# L1 D4 R# x" F - CLC
8 q& P- x. o) ^- ^ - ADC #$01
+ b( g9 Y) L7 K+ y( T - JSR Hex8ToDec
+ }7 K5 v2 S) r5 @3 j4 W - ( u% f- A/ i+ e: \
- LDA FC_Dec_Data_10
) ~; z/ W6 }$ ^0 b, X/ ` - CLC
c: W! L: {& ]& z- X% l - ADC #'0'( }3 y6 J: \/ b+ O7 f7 ^
- STA Use_PPU_Buffer,X
; r# A N* O [. i - INX
8 Z4 r% j8 E- j - 6 b1 l. F8 ?5 `. I% B# u% N
- LDA FC_Dec_Data_1
9 U- p" N$ g, f6 Q$ E1 z/ W - CLC
' o; P! M: W3 F - ADC #'0'6 K' @9 i( I8 a# O1 a+ ^
- STA Use_PPU_Buffer,X
O( [+ ?& J5 { - INX
- c, a& i% ^( D - / I7 Q6 ?. [! w
- LDA #'/'
2 b5 G3 W* B0 e8 z - STA Use_PPU_Buffer,X
1 C) J# y3 f% Z0 l! C9 P( f+ ` - INX- T1 O6 U5 T$ G
- * T+ [! o5 K9 f5 c, X
- LDA FC_Music_Max_Index
. q- F* q( b9 S/ Q( S9 {/ {7 y - CLC
. ]" G R8 ~; C, z - ADC #$01- X) Z# b# T) Q- T
- JSR Hex8ToDec
, g$ w+ o" C3 O A; T - # Y. d' V* R4 u7 d# |2 F u
- LDA FC_Dec_Data_10
; S5 @% p! A6 y - CLC4 P, G3 g" l# M7 U/ W7 ?# R
- ADC #'0'
* Q# f7 l2 A \9 I* f - STA Use_PPU_Buffer,X( s: U! Y. _0 F% _
- INX
: v# Q' R4 |. T; W5 j2 A( Q -
+ W6 L5 m4 d- y2 o5 L - LDA FC_Dec_Data_1
" F( e; _- n$ m1 l/ {, _! V, k - CLC
; k' e; C0 p& G) |1 e" a - ADC #'0'5 J9 F& u" L' z- {! i
- STA Use_PPU_Buffer,X
% K2 x/ a& R2 j# a0 J/ u - INX
/ G' T5 p# j1 M- V' s; v -
, N/ Y2 n+ t+ J% S7 Y - .End
" P( | ~+ Q: x: \ - STX FC_PPU_Buf_Count% o* }) \& r" ?- f. B
- RTS ~9 T; W0 _ W+ P
- % p2 I& k, F4 c' s9 J
- ;----------------------------------------------------------------------
) {: [3 v2 S3 N1 [ - ;音乐曲目初始化处理! ~4 ^8 m0 [( q: @
- Music_Init_Process
* |' b" s$ H& \/ M" z$ y5 o4 ^ - PHA3 u# K# p+ D+ d, R" O& Y9 `
- JSR Music_Clear_Process
4 g, y) s+ G/ X$ o5 i! G - LDA #$1F
# ?. |7 ^( a6 t9 n - STA $4015
. P5 }) h3 p$ `* ] - PLA
& c7 X8 L: P0 D9 ~! P; J - JSR Music_Init_Addr5 {2 n( c l, u" L# A* n1 H
- JSR Music_Info_Display2 V5 i1 i" m( |- f- u
- RTS
3 [: z, Z. [. J* X" l' v
0 ?) S1 b( H- g+ v! c- ;----------------------------------------------------------------------8 P$ `/ l5 R2 {2 o. a4 M& R4 c
- ;音乐播放处理. z; ?- V) o, N' K6 k" C: z
- Music_Play_Process
. P+ M; B8 v# o6 U1 @! j) B - JSR Music_Play_Addr% m9 M) d' k: T6 @0 c; y1 r
- RTS
, t: @* g) `2 e* a: A9 |
( [# x, a* q5 g3 L- q- o- ;----------------------------------------------------------------------- r' _, N$ j& b4 [7 `3 E
- ;音乐播放处理
' e: _) q# `7 V5 @% l - Music_Clear_Process8 `' G) n2 _* ^& _0 `
- .IF Music_Clear_Addr
" v5 S9 f- O" I - JSR Music_Clear_Addr8 p# k4 F( b6 o5 B* \
- RTS* [0 Q( g' S, P$ n
- .ELSE
4 T( w+ K. h! Q; | _ O3 d% \ - LDA #$1F
3 e& c0 ]+ n% G0 R5 L - STA $4015
- O' D8 m+ M y$ g; f/ V4 n - LDA #$00# S" N7 h J3 f3 |
- STA $4010
% _- D" T8 C# R0 V! Y* R9 h - LDX #$00 C0 x% M( n8 ~; q
- LDA #$00$ s5 U# T. y8 ?" e
- _* B9 z R" \
- .Music_Clear_Zreo_Page_0& y. f5 V; g8 k$ e
- STA $00,X
. [6 [( K% ~; \$ C$ U3 q* y/ p+ {& z - INX
% s/ P( a2 I# F7 I1 h3 _ - CPX #Use_Zero_Page_Begin0 o, X% ?: `% t/ D+ N( D! s* m
- BCC .Music_Clear_Zreo_Page_0) Z6 V; y7 d& K9 Y' j& P( D5 A
- 7 I6 W' }" {0 I6 G
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size. _; f* `7 B0 d! D( [
- .Music_Clear_Zreo_Page_1
5 u! }7 {! p6 @& ? K! D - STA $00,X
& n# }4 v! m: i( u0 o! e - INX
0 E9 M: H& I& O - BNE .Music_Clear_Zreo_Page_19 M X6 E5 H' ^. b) J
-
0 `! P+ ~; ~& c, C/ Y - Music_Clear_Process_1
: N9 r" I6 o( ^- ` t, N - STA $0600,X
' s" p7 ]; m4 v2 i+ C5 x - STA $0700,X
) K( G. j7 \1 o - INX
+ n- b+ k3 T7 K& r* R$ z _4 d! t - BNE Music_Clear_Process_1) D" W% |: H% r
- LDA #$10
9 B" j7 n$ @% e. w - STA $4000- t/ u7 u+ F1 W1 j& m7 n2 m1 F. D
- STA $4004
+ a G0 M. D$ ?0 F5 v2 h - STA $400C
: B. ~7 r6 `6 D( ?; _$ q* j" A - LDA #$00
* l" h' a9 Y0 M$ o5 W' |, Z - STA $40080 Z, K, B7 p: {" u! q; @- n3 G! X
- LDA #$0F, @; s+ b1 k8 ^5 y
- STA $40153 o! s6 R6 d# u! U# {- b! p
- .ENDIF# m9 [2 N4 a$ t8 ?& v' u
-
2 l ] p. [+ m: j8 W - RTS
, E. ^/ I1 S; q$ a( I/ Q- E
8 G7 E5 _. u0 |( u# c6 H5 M- ;======================================================================
5 e0 K; I; |, g3 E5 l6 q - ;重启处理) E% s+ e( C" Y
- Reset_Program0 p: G% s. Q6 m, i- Y
- SEI# v4 ^/ g$ }3 V3 C' K2 W- f
- CLD
) k- X' ~) m5 O8 S. l - LDA #$00
" I5 T( j( q# v3 x7 M' H l/ Z - STA PPU_CTRL; [! e% J+ [" @: U
- STA PPU_MASK
8 z: c. S$ n6 T& v; R; G+ S$ O9 l( T - STA JOY2_FRAME
' |! I5 R2 N t( p1 l - STA APU_STATUS
# k8 T! T- t/ t7 i/ ^+ ^ -
1 G+ Z- E! K8 L7 `. | - ;等待屏幕准备完毕! K9 I, n& c8 r& R3 B0 l+ y0 K
- LDX #$02
, U# t0 E/ W6 q+ o - .Wait_For_Screen_Ready
9 K1 L; F7 }2 a- O( } - LDA PPU_STATUS7 {5 y$ i6 `2 h
- BPL .Wait_For_Screen_Ready2 f' A' O0 q# M: [
- DEX
5 v9 U" X7 o1 A1 b, k4 V - BNE .Wait_For_Screen_Ready
- n+ Z o, h9 s0 c& A# N - , E1 `2 X( @/ {) a' _$ R6 o# A Q
- ;清空调色板) F7 v+ ^1 I* L" ]4 U7 w7 k/ B
- Palette_Clear3 P# s1 u- ]! j5 K
- LDA #$3F
$ s S/ l& _1 N8 e+ a. C - STA PPU_ADDRESS% W8 B4 l2 M" e% m1 T
- LDA #$00' n& |0 g7 O& i0 E: L- U2 ^* q
- STA PPU_ADDRESS
% t+ l7 Z+ r+ ^8 m% ] - LDX #$20! N* b$ v; J8 |; p
- LDA #$0F
, u7 ~! C' v6 {% D5 [ - .Write_Data) }1 C% ~5 W, g( H k1 w: Y5 H1 N
- STA PPU_DATA4 T* t, \/ c2 z) S7 l4 q$ A4 S- k
- DEX) |. d: i5 m% X8 y
- BNE .Write_Data) F$ o* b* f4 v4 t3 w
# O6 t& R t, p/ ^3 I8 W- ;清除声音 $4000-4013
/ u" [" P; ^5 w - LDY #$14
& O/ u( _. P7 m4 M, @1 P+ E - LDX #$00
4 e+ g; ^/ O3 q - .Sound_Clear( X/ F& y) q+ E0 g6 l$ u
- STA $4000,X
/ N! @1 `3 Q; `3 k5 x4 W+ y" I - INX9 _. `' [7 n0 N( w1 c& m7 @
- DEY
! {# y6 m4 ?: L0 G7 R) V) a4 E - BNE .Sound_Clear
$ H" a p. p2 G - 4 ~- {$ B* ~3 d+ I# }# A+ i
- ;清除 RAM $0000-07FF( D8 z& f8 p3 X# {% I
- LDA #$00
9 b* p3 s7 p' W$ R - STA $00# b) }/ T1 ?, A7 v% w
- STA $01
; `+ x" h; o- ]8 O" ?* S2 o - TAY
1 P. q6 w1 ~ N. }" B5 Y - LDX #$08
' \# u' v; l& h9 d8 l9 D | - .Memory_Clear! r* h9 L M: t+ b* J1 Y
- STA [$00],Y
1 ~% A2 [/ w+ f- L: O) a0 U - INY
4 t4 _' r: J- K" ~ - BNE .Memory_Clear
- C/ v! U# Z. i( B - INC $01
2 Y9 s/ k1 t% O; V# Q7 ? - DEX
0 E+ ?% e4 @2 B# x1 `5 A - BNE .Memory_Clear
% d1 i% F* l! P; z! b$ B, }. x - # n' q1 Y9 S; {2 G5 ]
- ;精灵缓冲初始化
6 ?7 _$ \0 o1 f) ~ - LDX #$00) X! g) k% M8 q" o* p! ^
- LDA #$F8
+ S) s) A4 y0 m* u0 A6 {; i ?2 H - .OAM_Clear8 w% k* e; L, f$ q7 q
- STA OAM_DMA_Buffer,X* L7 b B3 X: j# ~
- INX
3 R$ t$ t9 K$ c' f* J6 l! m. i - BNE .OAM_Clear* y$ l0 @% y5 E
- ) b% ?1 C/ p3 \" Y: S
- ;栈指针初始化! O2 y$ |# [+ S3 J8 `
- LDX #$FF
. G/ N; M; `, z. S" k, c - TXS. T/ a# H6 r5 [% g. b' k0 U W
- v( M$ q- \( H7 h& s. m
- JSR Nametable_Clear;命名表清空& C) s) I- k/ L, g
- JSR Palette_Init;初始化调色板缓冲8 X) f. b! H, c3 T5 E
- JSR Static_Text_Init;初始化静态文本
& h) D% u/ N! } ^+ ] -
1 E8 Y/ R% ]8 {3 v* _ - LDA #MUSIC_ITEM_TOTAL - 1
' \' W; H' { b! D9 ^ - STA FC_Music_Max_Index- d3 ?; t# |/ @: b) U: a! x5 I
- $ F: p# {/ w) v$ U# P3 v) b( q
- LDA #$1F6 _3 m9 N( H4 c8 `" I3 n: I7 n
- STA APU_STATUS
. r/ j; v$ V3 U- t - LDA #MUSIC_BGM - 1# }9 n% O5 ^( @# D2 R$ k
- STA FC_Music_Index
4 a* A5 k4 ?9 n! \ - JSR Music_Init_Process;音乐播放& o8 |( K' t2 e) ~+ z4 t& q
-
0 Z. I% N1 F; s% [6 ?0 J - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
" L: x: t/ q, f u2 U - LDA #$1E G& K* A! |% @$ W& c
- STA FC_PPU_Mask_Buf! F/ S; N ^% Z) N* W. W8 V
-
9 ~2 }) o f: s! o; O8 N - ;启用NMI处理" [" Q2 N) [# x& N
- LDA #$80# R6 b; I! |6 S4 |% y5 s* X( B
- STA PPU_CTRL
: G& T' @1 u G% Q7 x1 B -
5 n' o* A) A/ O' V - ;程序循环, 剩余工作交给 NMI 中断处理5 l0 S$ @# O2 Z ]. i& h
- .Loop
. t/ X3 K! W* W% I) L) ~4 m - JMP .Loop
! l1 F; b- ~8 U, y - 3 f" E+ f' T- x" `
- ;======================================================================7 A' W5 P6 Y7 U8 [
- ;不可屏蔽中断处理$ U% Y+ N) e% z* ?3 c6 ?/ l
- Nmi_Program' ^+ c$ j: _4 W9 A1 B3 X
- PHA
7 q" c) }2 |; @; N1 V9 Y% z - TXA1 [* D7 K1 k& ?6 X$ \3 `7 A
- PHA
$ @' {- r8 x' M4 |, Q* j B8 W - TYA3 O5 J8 r8 L/ i1 `2 x
- PHA
. w! {+ t0 R8 i9 _! n -
7 T6 R! A9 t: E, y# V! H - LDA PPU_STATUS;读取使得 PPU状态寄存器复位
' Y: q( j8 M+ ^6 C. T - - @$ R$ J6 D" s9 f) X
- JSR FC_PPU_Procrss;PPU处理: O4 \( @; l. W+ l# `! {5 q
- / @5 w2 x$ ^" I( w
- ;精灵内存更新4 e4 T+ _8 T5 Z/ _# G: d( } k
- LDA #$00- }0 R- r. u2 J0 V; @! c8 C
- STA PPU_OAM_ADDR
" [( r0 f8 c8 I* z) h# d: Q5 ^ - LDA #OAM_DMA_Buffer / $0100
8 @, j: k) s l" V - STA OAM_DMA8 q4 E0 Y+ v- A/ F/ N
-
$ m$ H3 ~3 D% V# e! f) g' X - JSR FC_Gamepad_Process;手柄输入处理
! l3 O% z7 |8 |" k6 P; X - JSR Music_Select_Process;音乐选曲处理
( d6 Q4 I/ j9 O - JSR Music_Play_Process;音乐播放处理 l; }1 F1 U' \( V; x' u1 q" }
-
6 U/ Y% }1 J! } r* ] w3 k# m - PLA
: m) B2 b( w9 A- B# x7 z - TAY
1 I; C4 H( t3 g# ~ - PLA
* ^5 G0 m. [2 [! c2 D4 z- ^ - TAX6 k4 T# A0 e( b; B9 s
- PLA
i! @5 B$ N( h' L4 S: o - " G& w& ?9 G2 n1 O
- RTI
6 ~. p# }! O2 g' }* F# I0 l/ }
8 r2 h! H/ p/ v- ;======================================================================1 N* U/ Y/ g2 X/ W- u
- ;请求中断处理
+ o3 I& g3 ~; v, ~ - Irq_Program" t% h: i$ Q) L, y5 u; J7 Q+ T- X9 K
- RTI
% \9 N- z) H" E, ~4 P3 l& {5 W$ ^ - + V! K& W# ?9 [% X
- ;======================================================================
: l) S. |+ W+ C* F% y" |' c - ;中断向量表
0 J' B# ` e K' t. V - .ORG $FFFA8 C% c6 j3 O ]! J0 m
- .DW Nmi_Program ;NMI触发时执行
3 V' ~- Q' k7 I - .DW Reset_Program ;载入ROM时最先执行$ w+ B; n1 F1 i& x+ f
- .DW Irq_Program ;IRQ触发时执行6 U' a% H$ B# ]1 ^( V
复制代码 ! T, f# Z& ] ~7 \/ j
C( ^+ D9 Q; G3 u0 _
$ L8 M0 O( F1 N5 P {2 ^' O# ?https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|