|
这是个 nesasm 3.2 入土教程, 感兴趣的可以研究下
/ k0 I& } G' {% z9 K
% o% L3 v' @( b3 e, E' [以下是主框架代码:
! ~8 u9 A. s6 x5 J0 N& Z$ o- ;======================================================================3 \, K/ M* D; S2 v4 t% F# y6 ]+ m
- ;文件头
. r; I! M; C# _0 p+ R+ U4 T - NES_16KB_PRG_SIZE = 8 ;16KB PRG大小数量8 N9 d1 P+ w) X% y% k: k
- NES_8KB_CHR_SIZE = 1 ;8KB CHR大小数量: ^6 a- q+ i! g" @# G6 j
- BANK_DATA_MASK = NES_16KB_PRG_SIZE * 2 - 1 ;bank号掩码6 O, `# ?3 G, U4 F6 `2 X4 [
- ;======================================================================
5 R4 p7 X5 T4 p( h* ?5 I - PRG_DATA_BANK_C000 = NES_16KB_PRG_SIZE * 2 - 2$ k7 ]- U, h, d. w
- PRG_DATA_BANK_E000 = NES_16KB_PRG_SIZE * 2 - 1
4 G1 v3 \+ w& Y) D3 H - ;======================================================================
) o. k8 m4 X( c( u( N! b( l - RESET_BANK = NES_16KB_PRG_SIZE * 2 - 1
$ ]6 n9 w' _; w - RESET_ADDR = $E000 ;主程序起始地址. ~2 g4 C d9 G* h$ T, ^: R, r+ d
- ;======================================================================
- Q b; I; J1 o3 t' n X1 p - .INESPRG NES_16KB_PRG_SIZE ;16KB PRG 数量, $01-$EF8(1-3832),即16-61,312 KB
! o0 B# d/ S! i" K8 S - .INESCHR NES_8KB_CHR_SIZE ;8KB CHR 数量,$01-$EF8(1-3832),即0-30,656 KB
, b3 r. A/ W/ J* C - .INESMAP 4 ;Mapper号 (0-4095)+ n$ D% b- N# g" W+ V+ o# s: O: L$ A6 G
- .INESSUBMAP 0 ;子Mapper号 (0-15)- ~4 R( \( N5 r5 y
- .INESMIR 0 ;命名表镜像 (0: 水平 1: 垂直 2: 四屏)
2 g& ]7 {0 W% A: E$ c: L - .INESBAT 0 ;指定是否存在电池备份 (0: 不存在 1: 存在)2 e' d/ n0 i# ~5 C
- .INESPRGRAM 0 ;指定 PRG RAM 大小 (大小 = 64字节 << 计数)2 a1 l' P4 ~) ]/ u' t) W
- .INESPRGNVRAM 0 ;指定 PRG NVRAM 大小(大小 = 64字节 << 计数)+ A0 K2 r5 @2 q0 V- t8 x
- .INESCHRRAM 0 ;指定 CHR RAM 大小(大小 = 64字节 << 计数)" w# p$ A; \9 \3 i/ p
- .INESCHRNVRAM 0 ;指定 CHR NVRAM 大小(大小 = 64字节 << 计数)+ N4 k4 T: E* t, C9 f4 ~
- .INESTIM 0 ;指定时序 (0: NTSC, 1: PAL, 2: 多区域, 3: Dendy)" S2 l& j& ~+ U+ m5 Q l2 b+ N; b4 |
- ;======================================================================
. g& @7 n) [( D0 P% n - .INCLUDE "fc_demo_config.asm" ;全局配置
7 h/ @5 w1 T4 I2 ? - .INCLUDE "fc_demo_constant.asm" ;NES常量
! i; b& l2 |1 e4 Z$ K3 ? - ;======================================================================
/ T" J+ K/ a0 }( x - ;音乐配置! {2 F( Z: T- d. @
- .IF 0 = MUSIC_THEME % H$ l$ l3 P1 n$ K. ~
- .INCLUDE "data/music/Gremlin 2/config.asm"8 p; f* \$ E5 D
- .ENDIF
0 x$ t7 }. ]9 r2 U# Z - + B Y& o3 O# S9 _5 h$ _3 V
- .IF 1 = MUSIC_THEME
( [' v! s2 T; l - .INCLUDE "data/music/Raf World/config.asm"
8 L0 B6 @' Q5 I- \9 d) P - .ENDIF/ T% z" Q' g; F! f+ Y
- " h1 b$ n" m( ~, m6 C8 z2 M
- .IF 2 = MUSIC_THEME % w" i; X9 M# u$ O* E
- .INCLUDE "data/music/Ninja Gaiden 3/config.asm"
, t% S/ r( {: R* j. {9 j - .ENDIF
: z1 e5 X1 J( d6 u' w$ T) D
. k( J5 d: O3 D$ h* v* c- ;======================================================================: Y" ^0 x5 V* w' Q# s3 W2 e5 Y
- ;引用CHR图像数据, D9 w8 v$ H; ~: O3 W8 A
- .BANK NES_16KB_PRG_SIZE * 2
_ u5 Z9 E& Z. }" H S - .ORG $0000
& P" Y1 W) X a& y# z: }' P - .INCBIN "data/bkg.chr"
, @) j- |8 |3 S9 H3 i. | - .INCBIN "data/sp.chr"% H2 m& b$ b# N' O- B+ l" e1 [- X
- # X8 R2 L8 Z1 m, L: Q
- ;======================================================================4 l% U, r2 |' H# p9 e+ j
- .BANK PRG_DATA_BANK_E000 & BANK_DATA_MASK;设置程序所在Bank; v* x. }& y: h4 Q& o* l
- .ORG RESET_ADDR4 n: y" r6 u g! H) H
- ;======================================================================
+ R- Z* B) B8 z" D4 L. d. F! V - ;引用其他源文件
* o: x' f' |- Z- K% j, n* I& X - .INCLUDE "fc_demo_ppu.asm" ;PPU处理
& u f" v; X% i* y - .INCLUDE "fc_demo_joysitck.asm" ;手柄处理
3 d7 N e* r, t' E Z - .INCLUDE "fc_demo_static_text.asm" ;静态文本处理" E u% ]1 r1 `3 N; q
- ;======================================================================- Q% c" u6 |! f" a
( Z7 o! f3 f) a: ]- ;======================================================================
' d8 I/ e& r! y7 W5 V' K6 @ - ;等待VBlank到来4 _5 X8 V p5 j* q- O
- Wait_For_VBlank
, A6 h* p2 V6 Z, p - LDA PPU_STATUS
* ^! m6 i& T$ ]% b$ M; ]$ W3 f9 j - BPL Wait_For_VBlank9 v/ N7 D, o4 e9 {$ r" ^' s# Z _4 Z
- RTS2 |4 S/ M7 t% O6 J( L
M- m) E; C4 P- ;======================================================================, u5 d' L+ C4 ]* [( K
- ;调色板初始化 G8 ^+ D5 X( x+ D7 Q" [: A
- Palette_Init5 f5 n. i- H; S% o8 ^
- LDA #$3F$ P) J( e& A9 y! U. a% I% X
- STA PPU_ADDRESS- ~6 M( X& t. Y( U, [# {* j
- LDA #$00
6 f' H+ d& i- Y - STA PPU_ADDRESS# I6 x& u' K) ?6 A% G; W' C2 x( C( G
- LDX #$00
/ F. z! l {8 P4 G - LDY #$20# Z ?8 d1 e0 T: E) @
- .Write_Data) h8 {4 G, y9 \
- LDA Palette_Data,X# l3 h( n3 p2 X
- STA FC_PPU_Pal_Addr,X7 L Q/ Y; R- C& C a
- INX
; L% H9 v) m) z, `- u8 C. ~ - DEY* t1 _. z v$ f! Y( b& I/ r- A/ ?
- BNE .Write_Data
/ Z1 ~" |9 E" w" G5 {& `) ~- t2 q - .End. {0 R0 e' r9 D
- RTS2 u1 @* ^8 {5 n5 ?+ ~+ h
4 R7 {. `8 x% m/ @4 O- ;----------------------------------------
4 ^4 I6 l: O/ q3 E# U - ;调色板数据6 e4 K% I& T7 X2 D1 s" u1 w4 ^' f9 r
- Palette_Data# N2 k Z0 }2 x% ^# T
- .HEX 0F 20 32 02 0F 20 32 0F 0F 20 32 26 0F 1B 0F 1B& P8 y1 y5 }4 T3 U
- .HEX 0F 21 27 22 0F 24 24 24 0F 21 21 21 0F 22 22 22
4 |( M* }& {! _# } - W2 q p2 Q# [0 G) }. p5 p) }7 P& x
- ;======================================================================
2 n* e( ]' R1 E& t, b6 E - ;命名表清空; I! x+ O0 J5 }, C i
- Nametable_Clear' W) `. F5 z7 p+ W0 S7 H. l
- LDA #$20
% V& `. y, I+ } - STA PPU_ADDRESS
' s2 g) R# a+ Q& c7 d+ S - LDA #$001 M0 b ^7 ~* a. C
- STA PPU_ADDRESS2 f% N7 l6 Q- W/ }- K' M
- LDA #$00
$ N3 g% R( I0 g - LDX #$00
4 {3 C0 R {4 g! f5 q' \4 D - LDY #$08" P$ s$ ]- p6 {% ^0 p2 R+ e2 Z4 e: j
- .Write_Data/ {+ D9 v# V( Y/ n% `& U
- STA PPU_DATA
+ O4 F* H I' F# `! a( e - INX0 B/ ]5 f. k6 _1 J% Q- h
- BNE .Write_Data
' J9 T, {! K! }& h( T+ u- Q1 a% C - DEY
0 M3 F* s$ u( U, F - BNE .Write_Data
. \" B: Y# z/ f N1 K - .End
O" y" M. |8 O - RTS: S* @# x, U$ I7 m: v) u0 N
( Q0 C0 w- n9 V+ p7 n- ;======================================================================8 {/ \8 _( F+ u; L. ]1 A' ~
- ;音乐曲目切换1 M" L* ]6 s: h4 }; T1 a
- Music_Select_Process a/ a# j$ l$ p+ N& l
- ' q' z/ @; s) N$ e/ A" B
- .Pre_Music;上一曲
9 I; O# f2 o0 A- g& c* E8 Z! t9 ` - LDA FC_Gamepad_Once8 K9 Z. k) d! E; {# _3 q( y
- CMP #JOY_KEY_LEFT" j0 O1 B' ~' `
- BNE .Next_Music
5 `8 v6 G2 Y3 g2 ]: _/ N - JSR Music_Play_Pre( G& U3 {( Y4 a4 E3 Z" m- y
- .Next_Music;下一曲
5 L x; k; I; n$ Y% p+ e4 L( B - LDA FC_Gamepad_Once
" J2 y9 M! X$ v0 ~4 C2 |6 T% w - CMP #JOY_KEY_RIGHT
* ?" H- K2 R1 A! z6 V - BNE .Next_10_Music. p$ V8 I/ Z" d' e
- JSR Music_Play_Next5 x: Y& J3 \5 w0 W4 ~
- .Next_10_Music;上10曲) d' G" g+ j/ q( u7 R- _
- LDA FC_Gamepad_Once) @4 B" l9 K% z% A: r6 P& v
- CMP #JOY_KEY_UP
) t/ V$ l& Q; z/ A+ o - BNE .Pre_10_Music
+ K$ k% |$ O2 \/ } - JSR Music_Play_Next_10
- C3 K: j- O w" s3 p3 I - .Pre_10_Music;下10曲
% M- ~& \# N$ P% ?8 A1 c2 J: X - LDA FC_Gamepad_Once2 g0 j' F4 \ r5 X
- CMP #JOY_KEY_DOWN4 w/ S4 l7 h3 m
- BNE .Reset% h p: [4 W- Q% L. b: ]6 v8 M
- JSR Music_Play_Pre_10
2 Z6 A& G' S2 f. J# b - .Reset;重播当前曲目
, s3 d& Q8 v) w4 b - LDA FC_Gamepad_Once
7 T( \% V% a) ?: v& ] - CMP #JOY_KEY_START6 T2 K! J2 d E( b( z/ X8 J+ P
- BNE .End, S9 ~6 y u5 X/ {
- LDA FC_Music_Index) f# c! T k& X7 u
- JSR Music_Init_Process
- y8 c" ]- t$ t8 g( S" o: g( {) t - .End
8 S- Q: W; ? a g& j* n& d - RTS. A) k* }2 C* e& @0 J. L
C" u' A6 k& A& v7 v+ B* H0 z- ;----------------------------------------------------------------------
# ^3 F/ V8 n2 s0 O& W - ;播放上一曲2 }1 C0 F1 i2 g9 k. s7 ]; S
- Music_Play_Pre
" L2 ^1 E, V% z# y6 F; O% \0 A - LDA FC_Music_Index/ g d; ~' f" D1 z& Z6 q8 ]8 l) S
- BEQ .End
. d" j" \! v, B4 Q - DEC FC_Music_Index$ o- X; |9 v/ Y! e6 X3 |6 c
- LDA FC_Music_Index
, r6 b6 V( ^% Y0 x- i/ ] - JSR Music_Init_Process
( B& r. Y0 e& _7 l- H0 n - .End9 K; N" a8 j$ ]8 b/ |2 Z
- RTS# J( K' |4 ?9 ~# p3 R" C
- ;----------------------------------------------------------------------5 @+ X1 h9 v& z9 V4 M9 }
- ;播放下一曲0 `+ B- w4 j" G5 C X" s
- Music_Play_Next5 @/ M, R4 O. \1 {
- LDA FC_Music_Index" i4 r* v3 p7 G6 `/ P8 ]& m
- CMP FC_Music_Max_Index
& L+ Q6 v t5 |. Z' e: l - BCS .End, P: h s" K: W3 Q, q+ R+ x
- INC FC_Music_Index% ~- F* o" {* }+ o4 z
- LDA FC_Music_Index) l) k5 t% B$ @
- JSR Music_Init_Process1 s$ T) `8 E# H. ?. s1 U
- .End' K& r; y7 `7 Y' S% @
- RTS
% W, b! D) K& L5 h# k7 w9 v - 4 U8 n0 B; k, N! B& i# ]
- ;----------------------------------------------------------------------
. S* U, e9 p O, j" c5 V' ] - ;播放上10曲1 N& O7 r; C, N) `( ]( E+ k
- Music_Play_Pre_10 D- a& d* O5 @: v3 u) Q
- LDA FC_Music_Index: i: L; i; l, S: }& ?$ U! G
- BEQ .End
# o1 \* s; ?5 B: W/ E - SEC' ^2 R/ y% l4 @: d. o
- SBC #10
, D6 v, K" F$ T7 [/ H7 l - BCS .Pre_100 F X4 B v: N
- LDA #$00
/ \- S) e; R ], Q& |0 ` - .Pre_10% B" X! |# Q6 T" C7 M3 n( h
- STA FC_Music_Index4 c9 u2 f* i* o+ O
- JSR Music_Init_Process! F' [( a1 |' W; B4 K* ?# @
- .End1 g: ?8 l1 W- j2 v
- RTS" i4 @# l# O* X- I
- ;----------------------------------------------------------------------
$ m0 A, N* }1 Q" t - ;播放下10曲4 `, j K3 M: Y7 M1 G
- Music_Play_Next_10
3 H+ @* A" b( s: r* D - LDA FC_Music_Index8 d8 z7 c/ D8 d- J( _2 h
- CMP FC_Music_Max_Index
. o3 ?3 X- B, K- c* v' w. j6 _: }1 B - BCS .End/ L' B+ Q5 Z; {! j9 T6 y, e
- CLC
2 C# }9 |: r; \& V) y" \/ w) O5 h, p - ADC #109 g, _4 E8 p% x: G5 ^
- CMP FC_Music_Max_Index* J. O% B8 |0 ?' }: N
- BCC .Next_10, T" r8 V, ^6 `; K* I
- LDA FC_Music_Max_Index
# F- f$ g0 t( b+ f" Y - .Next_10
5 N( w- N- c+ _/ T: G8 J+ o - STA FC_Music_Index
2 a: \" ^' a+ \4 h: x% q1 N - JSR Music_Init_Process \/ q n0 C' z' s- G% s4 Q
- .End
7 g" G' \* J0 f) S A& b8 g - RTS: _ [7 ?6 l, v, L9 t
- % }) }: G' [( l' u' }8 ^
- ;----------------------------------------------------------------------
: j, H* F, Z. t5 s8 V! a - ;8位十六进制转3位十进制制! z7 }) ]: d5 @& \, @/ b j& y
- Hex8ToDec, C6 \5 e- \0 h1 T. E# j
- STA FC_Dec_Data_1/ g( w! \7 n9 A% T: F9 T
- LDA #$00! C3 b4 q. G5 V, k
- STA FC_Dec_Data_1007 x! ?" m# `: c
- STA FC_Dec_Data_10. \5 v$ X4 S. G, M* p
- LDA FC_Dec_Data_1
3 a5 y$ ~ Q, I U# w$ r/ s - .Convert_100 v/ f4 S, b; x# H
- CMP #100
& R1 P3 h# V/ |; v; [ - BCC .Convert_10
! P. ^5 C$ K: c) @: N - SEC
3 r! i2 y* j* n - SBC #1004 {! X4 u; h2 h( @: p9 ~) ?
- INC FC_Dec_Data_100* S" }% Z: L1 y8 Z6 h3 q
- BNE .Convert_100+ k' _( ~% D6 T) v- E
- .Convert_10
E- s1 \) A: e - CMP #10
+ \6 m& ^! ]' c2 z$ g - BCC .End
9 ~- h* M% G8 l" ~+ o - SEC
* a- x+ \3 ^2 F' M( d/ d& b - SBC #10
$ Y; z8 Y7 m8 ], Q - INC FC_Dec_Data_105 x' w% I; |2 {! _# d8 @. r
- BNE .Convert_10
9 V$ x$ \3 J$ x( [7 K$ |5 t9 f: x' n9 _$ } - .End3 c" B' E1 l6 I4 k6 k8 w1 k6 d
- STA FC_Dec_Data_15 M, @. B7 v# d2 l9 m; i4 ^
- RTS
^; \( \7 ~! ^+ c
( @7 S# o( p# y4 o) L7 E- ;----------------------------------------------------------------------
0 p- J- _! y6 H6 E7 K0 `' y - ;显示曲目信息# ~* j- N( l$ B* d' ?! m; T; p
- Music_Info_Display G7 {& D) E; I% |' Q/ ~
- LDX FC_PPU_Buf_Count2 i# A) m: g( @+ v; j; t1 `
- LDA #PPU_WRITE_MODE_CNT_LINE5 R+ x$ p: C. f/ e
- STA Use_PPU_Buffer,X1 W* F- O# h: ?9 k! N
- INX
6 w5 K* o8 L: ^0 V7 z - - J5 l" y& D5 W
- LDA #>MUSIC_INFO_POS
) j# H" w7 j/ o9 i2 C5 a - STA Use_PPU_Buffer,X' s# |( F* J6 z: `( _) r- ~2 ^
- INX0 W8 ]) T- N9 A) P" @
- $ k# \' o( @4 h( e7 a
- ;居中) K$ D5 A1 \) N O8 x; H. M
- LDA #<(MUSIC_INFO_POS & $E0) + (32 - 5)/2+ r% p+ P& L7 l+ P) [& M5 ^
- STA Use_PPU_Buffer,X; t- e0 d4 g3 f, o9 K- v) x+ S6 }) h
- INX/ G* V( W8 h$ T$ Y4 j' O- X# r9 y
-
* S6 o1 u" I8 e - LDA #$05' T7 Y1 U1 K8 W# Y
- STA Use_PPU_Buffer,X7 R+ C: S7 ~2 Z; v
- INX7 y. s' Q0 B& R
-
" r/ d: S, E3 G - LDA FC_Music_Index* A) `- [; h3 \" d* g
- CLC* s7 K. O8 f( h9 \2 W0 B& x
- ADC #$01
7 r( M7 `* s. x# v - JSR Hex8ToDec3 I8 B) y' D9 a' ]' I- Z( A
-
" \3 _1 h, \! `% y& x - LDA FC_Dec_Data_10* J, k5 ^1 w$ Y( m a* |# U
- CLC" n* D% @, `& P- T# b
- ADC #'0'
3 w1 `6 k6 `( x% F/ j - STA Use_PPU_Buffer,X8 W! Y! e& h8 l; K# ]) ]6 G
- INX
- K8 j' }' b% P - 8 c4 V% C, h: v/ S9 N
- LDA FC_Dec_Data_13 v2 S! H3 L& |: ~" J$ {
- CLC% A1 L n, t; ^4 j6 N4 ?' a
- ADC #'0', N, n8 u8 _0 e5 R; C0 m$ ]
- STA Use_PPU_Buffer,X
/ T; v! y9 a$ T. {" H2 n+ s - INX& W! f8 p$ ^' m7 @1 H7 e/ {
- 6 f: D, }7 j' ~/ s% Z7 K9 _& i
- LDA #'/'+ }$ l X: @% U
- STA Use_PPU_Buffer,X5 N) R1 x) e( ?- P/ A6 \6 u
- INX1 y* G% @0 c5 [5 u p, {
- 9 D4 Q* F. _* F/ w+ ?- M$ p' ?
- LDA FC_Music_Max_Index! {8 Y7 ^4 F0 |; |- W: B
- CLC
k" e& J; D: q3 i" k* G+ B - ADC #$01) h) U+ O/ C U" l+ f8 q$ Z
- JSR Hex8ToDec t: f! |: Q4 W7 C) F7 r5 _1 E
- 8 w6 J" A8 [2 R* _
- LDA FC_Dec_Data_10
* L! Z, A l9 Z# G$ I! k - CLC
2 }* h% }7 E3 @ - ADC #'0'# T1 s* S& s8 l4 [3 C' G8 o7 |
- STA Use_PPU_Buffer,X
# Y5 U0 n. |5 l6 ]; Y( M N: f. b8 S - INX; l4 u6 y5 m+ o4 [1 F& e2 q
-
) l" |" | A2 W - LDA FC_Dec_Data_18 b$ j$ T. Q' t# x5 ?% I7 P
- CLC6 a+ @& L; Z: C3 e/ E: L3 t
- ADC #'0'' E) a/ `# H. K7 s
- STA Use_PPU_Buffer,X
) @3 w8 N. E/ ? {$ i% j - INX* w' x7 X/ r0 e3 x1 A/ W9 `
- , _: M3 x" ?" `6 ], `. C
- .End# i' X9 U6 U. s, b" ]0 r
- STX FC_PPU_Buf_Count
7 K, ~$ \, J- n% S3 y - RTS# m: `5 E+ p1 @/ p) n
( n0 [$ w$ x7 R( |. O- ;----------------------------------------------------------------------
9 {) m% \+ B9 d: {4 t, M+ P - ;音乐曲目初始化处理5 }. j" J; ` }: c6 u- o' j
- Music_Init_Process
6 H: \. _0 k# s' H8 x - PHA
: _# Y2 b7 i7 @. _6 v - JSR Music_Clear_Process1 l9 X2 X, Q5 K
- LDA #$1F
A1 \6 c: z$ V5 M; I) o t+ ^) M - STA $4015+ Y9 l* \" N/ b, o1 o! w
- PLA
8 g7 ?' {( A0 `* u. c; K& o& m! T - JSR Music_Init_Addr
3 E0 X9 ^. J. q# c: g - JSR Music_Info_Display
t" W$ f* ~( _* u; P1 ]. q( _1 j - RTS
' X1 f$ m" {8 Q1 Z4 z1 i
# l6 a, T" e0 Z3 X3 D4 U1 o- ;----------------------------------------------------------------------, E+ D( R0 N3 [9 \, I6 M) i
- ;音乐播放处理( _5 M4 s- `, E6 h5 @3 i
- Music_Play_Process0 X7 q9 I1 n3 I0 p
- JSR Music_Play_Addr
0 Q. f0 _" V5 t: x# z+ T - RTS
3 ^1 v- |9 r0 m( X2 W - ( ~; k! ]& }( z8 S' }
- ;----------------------------------------------------------------------' j( b" u1 m* z5 N0 [7 H1 U2 R
- ;音乐播放处理
, ~7 v3 K; K9 V - Music_Clear_Process5 R/ s3 ~4 a! _7 ]! v; ?( q& i0 G, [
- .IF Music_Clear_Addr
& v: I" z3 \1 a; [- ^) u/ Y5 V) P2 m# | - JSR Music_Clear_Addr6 B) `* z0 H& z0 |
- RTS0 h! r0 l/ H5 w* t) {' ~5 _
- .ELSE1 L- z$ J) E4 _6 l$ c/ t
- LDA #$1F
3 I" x2 I+ P% y! ` B' w1 E - STA $4015: K- m' @1 V. [% [
- LDA #$004 P0 I5 E, n% r0 O2 P# n) Y
- STA $4010
" P9 X7 f* [/ Y$ l - LDX #$00
2 V- F& P: s" U/ T' i' X) f0 N - LDA #$00# d# e9 M# I; a& |, J' E: T
-
+ I9 o' J% ]5 b% S - .Music_Clear_Zreo_Page_0
. |$ P+ }. Q8 `$ Z3 V - STA $00,X
* H3 R7 M) T/ a C l* m4 M* C - INX8 \2 c' p# ?6 ]; x
- CPX #Use_Zero_Page_Begin
0 n" F. O7 K7 q - BCC .Music_Clear_Zreo_Page_0( O! S# i" J9 @: {" K
- ; |9 O! \5 z8 g7 B5 _
- LDX #Use_Zero_Page_Begin + Use_Zero_Page_Size9 I: H. Q8 L. q6 b' I- C4 S' u
- .Music_Clear_Zreo_Page_1
) w% A) }' [2 o# ~4 U/ | - STA $00,X; ?7 K' s+ u$ b: Z' V
- INX
' S; W& t; Y( C' j+ D! x/ P - BNE .Music_Clear_Zreo_Page_1& S$ k! B4 }0 s5 E
- 4 J+ N8 B2 b# l* @2 d# b/ r# _9 h
- Music_Clear_Process_1
, L& r: o& }, F: i. C% B' U - STA $0600,X
+ c9 g( Y8 T( B - STA $0700,X
( ?8 \. J" k, u1 Z4 ] c4 X9 K, f - INX
, |2 Q* H5 U9 t7 Z# c - BNE Music_Clear_Process_1( }1 U: o. [; z, a) c
- LDA #$10
; x N$ {! D3 l. `6 [( n - STA $40000 Z- Q( q, J2 m3 W
- STA $4004" I1 m' s9 f: A
- STA $400C t$ q( r1 z" F2 `/ N
- LDA #$00* o3 j9 J4 I+ ?2 I
- STA $4008
- d& P# [: p; |) ?3 f3 s - LDA #$0F7 b0 X5 }0 q7 Z' k3 \
- STA $4015
. c" x0 I7 A- B0 A9 ~ - .ENDIF3 ]# X5 p3 K, ]
- ( Y8 x) }6 T& i( G$ K! S
- RTS
. c9 Z1 f& S# }* V) ?+ M3 Y
4 k1 F7 Y# f( x1 \- ;======================================================================
& k; p2 ]1 W, [5 u5 k - ;重启处理; L4 N8 M7 q8 |" a& Y
- Reset_Program
- t! @; O' b6 } m! {" Y0 z - SEI
& v \" q. @1 h1 i9 \ - CLD9 R% v0 E9 r$ l7 o: v
- LDA #$00
% d, P( y% G6 f! G( A9 ? - STA PPU_CTRL) y: q* ^* }4 I
- STA PPU_MASK
# E0 }. e3 N- D2 p3 O( r - STA JOY2_FRAME
3 P& [( F5 @+ `" y7 W9 H" C# h - STA APU_STATUS
" w' Q# @! @6 j -
" f8 e3 `- \; L0 z h+ i - ;等待屏幕准备完毕
) y( w1 ]. K5 w - LDX #$02& n# h0 g3 h3 _, G. q
- .Wait_For_Screen_Ready
5 }' O+ e$ x; V1 N0 E - LDA PPU_STATUS
9 y$ j4 ^" Y8 H9 n$ ^ - BPL .Wait_For_Screen_Ready
) F6 {# d- t3 o" U9 L* A/ | - DEX: R1 t4 ~% o# _/ C' W
- BNE .Wait_For_Screen_Ready
& Z/ c }# L/ B. i -
1 j, X5 [6 ]. I( H) C3 g - ;清空调色板& y4 X# a0 i7 j" Z
- Palette_Clear
; _& x% y% T0 R5 h - LDA #$3F
: [0 t o, \1 j8 Z - STA PPU_ADDRESS3 j# @- y* M/ f7 K
- LDA #$00
6 K7 ^$ |; B- [9 [ - STA PPU_ADDRESS
* u8 [* H* S: L+ T4 u& P6 t/ x - LDX #$20
6 f, P/ Q' i/ A$ \, } - LDA #$0F8 o4 d: {* _, j. i P* V& R- A/ j1 o
- .Write_Data
$ F( S7 T6 u* O# u" ^& z! Z - STA PPU_DATA0 V0 \+ F+ P. a0 @
- DEX
) R. t! r6 R& ~9 F, _7 r6 X7 v) ]& ` - BNE .Write_Data
! E5 [) h4 \1 ~
f. Y' K, y$ o( m4 |+ ~& O1 l- ;清除声音 $4000-4013$ f; E T- l* w. _2 v; i
- LDY #$14; h1 T) [) b: ^
- LDX #$00, C9 @& f2 z# t/ v$ V2 _
- .Sound_Clear
9 D" O; U! N0 c4 _" p0 {$ g8 B+ j - STA $4000,X
! q/ ]" Z6 h( x1 E3 M - INX* c( c- T7 u9 K0 L: p( P3 [6 G
- DEY/ x$ b/ f* Z' S+ X3 S/ [+ Y
- BNE .Sound_Clear
0 H& O z/ H ?8 [6 r -
- j. t. ~7 d' @: _ - ;清除 RAM $0000-07FF' y' h2 @9 `0 R9 G/ F" A5 j6 W3 y
- LDA #$00 K& p2 Y! E/ y6 r' b! E2 D8 ^
- STA $00
; K9 m6 @8 x; e- m% f5 \4 N. k- k - STA $01; O% \2 z8 c' I7 M5 D: C2 k, y" j0 g6 D
- TAY
3 R* n0 i- l4 m2 X! g! i8 _ - LDX #$082 }, o- z) D, Y0 E
- .Memory_Clear# ^2 ^+ c) y/ J0 q& |/ k
- STA [$00],Y8 e+ \8 Z- V: \$ L
- INY$ j* ]$ Z8 {# \6 t
- BNE .Memory_Clear' n/ e6 X9 G; @ U' n8 F/ d9 R
- INC $01, K& l' _. h/ h6 u$ j* d9 @
- DEX0 V/ C- u* P2 x$ \- t9 C7 |8 `0 q
- BNE .Memory_Clear8 ?6 h# n5 m9 i- K' w
-
7 m( B+ p8 u$ `7 ^ - ;精灵缓冲初始化! E4 Q( \! V0 k
- LDX #$00
7 I# G3 s5 S1 \# M1 J3 v1 c9 P - LDA #$F8! W: i1 r, P2 g; a" C1 c
- .OAM_Clear
7 [4 T2 w! c3 x! [/ U4 w - STA OAM_DMA_Buffer,X
4 |4 M" `; b& Q6 p - INX
$ z m+ m% r3 b/ s - BNE .OAM_Clear
8 n3 \( b8 B [% A, ] - : o- ] m+ ]' X2 ~
- ;栈指针初始化
@0 ^& Q* S$ ~( l* b$ d. S0 [ - LDX #$FF+ _4 ~! H+ q3 {2 d7 G
- TXS
& B4 B% w2 B4 r9 X( N' l5 x -
& [' N3 {: ^8 w4 { - JSR Nametable_Clear;命名表清空; X+ W2 u7 `6 v
- JSR Palette_Init;初始化调色板缓冲
3 j0 W& k( _- J$ C, E+ W Y - JSR Static_Text_Init;初始化静态文本
5 J+ L, _# ~2 \ - 2 r. K9 |1 ]$ ?) g8 T
- LDA #MUSIC_ITEM_TOTAL - 12 C# k; l# L7 G& U9 `7 m
- STA FC_Music_Max_Index
, [! R a) F- K7 d$ P( ? - - k1 B4 J- |: s( }) a
- LDA #$1F
" }% A) R0 z2 l/ O7 A" | - STA APU_STATUS
, P/ G* K) ]5 T. a N* Y0 G$ o - LDA #MUSIC_BGM - 1
9 q5 O9 V( w. }4 m- S - STA FC_Music_Index
2 z3 e$ }9 [( q" ~0 P - JSR Music_Init_Process;音乐播放& W x7 z2 ?( n
-
% A% B' b3 X4 b& C4 T - ;设置屏幕显示状态缓冲(当NMI处理时控制屏幕显示状态)
% D# p( _7 t2 \0 I; Y3 ^ - LDA #$1E
5 l! {' F/ H9 u - STA FC_PPU_Mask_Buf2 y& ~( u8 t0 e# _* d5 r0 W* ^, ~
-
7 e- C: r/ y5 D! e* a# S5 Z! e - ;启用NMI处理, r$ }# J; R. e/ s/ G5 M9 n( ]
- LDA #$801 n+ ]1 y1 X1 L! U4 }9 e
- STA PPU_CTRL
' \* c7 E0 o" O7 i - + j+ E1 n0 M3 c( ^4 p; W% \) D
- ;程序循环, 剩余工作交给 NMI 中断处理
4 f0 ~- C) z! R1 Q - .Loop1 A2 Z1 l) Y2 |. `. y8 F8 t+ B
- JMP .Loop J: j; p4 E8 q/ Z
- 4 b/ d8 ?5 ?7 ]# X- ?+ c
- ;======================================================================: L8 X7 o( o$ h+ m
- ;不可屏蔽中断处理
' v% ]/ o& w% p& Z& {0 R - Nmi_Program5 B# O* ^* W% v$ i3 ]+ h& \
- PHA
7 J; V2 f* C1 K; u ` - TXA" G$ x+ [/ _- R0 j% E
- PHA
! h) N$ x8 B6 B - TYA0 D+ h6 M! |6 g" W1 A( w' t, G
- PHA; ^* k/ n. c/ Y: K8 ], R% B( z' o- A
- ; Z" B! K% ] G8 y- l
- LDA PPU_STATUS;读取使得 PPU状态寄存器复位
% B& w" b) w& U% }6 Y/ l7 q6 T - ) @; U5 _7 i% |* w$ Q% |
- JSR FC_PPU_Procrss;PPU处理
' O2 p$ s! h, P/ w3 T6 s+ R - 5 C) b4 D: ^1 ]: x! k& N
- ;精灵内存更新/ A7 j9 C/ {5 J$ o) k
- LDA #$00
0 e0 q& [$ J/ J8 K- \* r - STA PPU_OAM_ADDR k2 k8 `! \: v% J8 Y
- LDA #OAM_DMA_Buffer / $0100
' q+ N& M; u& ?$ T2 d8 ? - STA OAM_DMA' Y7 P5 `" c* A! L5 N: [' N
- & c; v: \8 c- [" g8 ~- f
- JSR FC_Gamepad_Process;手柄输入处理
" H6 F" p+ p- d( e: @ - JSR Music_Select_Process;音乐选曲处理
* K! E! _ L# ?$ m( i* q u0 ~3 t2 A - JSR Music_Play_Process;音乐播放处理
9 x) U [* D- P) o - " J% W) a0 [2 E% y9 B
- PLA
3 k3 Z9 z% o6 {/ ^/ d - TAY
7 k ^3 e" Y% r1 N2 z) C0 r7 h - PLA8 w- q& L, a% b$ T% V3 g8 T! D5 t& p
- TAX
5 Q! q" _$ L4 o, ]; u- o B/ i& g - PLA" S, `; c l# |/ U9 l( \
4 A8 I. w* v1 F9 I/ }% r5 ?- RTI' _" C/ y m9 p! X" f
- 1 r/ z' m: ^9 o8 j+ ]2 B ~
- ;======================================================================
) a" ?5 U: C4 K v8 P - ;请求中断处理
) N$ t' [6 x, D - Irq_Program/ P& J5 J0 E) ]5 l. z3 G. L% v
- RTI
& b# _+ W+ u) z
8 i5 C2 J+ w, h* Q" A- ;======================================================================
! x b7 ?2 z" r9 T - ;中断向量表
" r4 N) T& g$ v4 T% p0 n- V - .ORG $FFFA6 `) ]8 x6 [( _' N% a2 O
- .DW Nmi_Program ;NMI触发时执行
/ e4 }% q$ {* z3 C, Z% m9 O5 B7 ` - .DW Reset_Program ;载入ROM时最先执行# k, i! X9 L: K& B7 S4 u# u, W
- .DW Irq_Program ;IRQ触发时执行
8 Y" w+ X. J. W
复制代码 ' [% X9 W7 \- A
0 z8 u, n( \# _( j- y. I) \& U$ v: F0 K1 ^* w' t, E# I% Q1 }& [
https://gitee.com/flame_cyclone/nesasm_3_2 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
1
查看全部评分
-
|